2016-12-07 2 views
1

У меня есть две связанные модели в ADO.NET Entity Data Model.ASP.NET MVC 5 Отправить Formdata из двух связанных моделей данных

AspNetUsers

public partial class AspNetUsers 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public AspNetUsers() 
    { 
     this.UserVacations = new HashSet<UserVacations>(); 
     this.UserSicknesses = new HashSet<UserSicknesses>(); 
    } 
    public string Id { get; set; } 
    public string Email { get; set; } 
    public bool EmailConfirmed { get; set; } 
    public string PasswordHash { get; set; } 
    public string SecurityStamp { get; set; } 
    public string PhoneNumber { get; set; } 
    public bool PhoneNumberConfirmed { get; set; } 
    public bool TwoFactorEnabled { get; set; } 
    public Nullable<System.DateTime> LockoutEndDateUtc { get; set; } 
    public bool LockoutEnabled { get; set; } 
    public int AccessFailedCount { get; set; } 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<UserVacations> UserVacations { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<UserSicknesses> UserSicknesses { get; set; } 
} 

и UserSicknesses

public partial class UserSicknesses 
{ 
    public int SicknessId { get; set; } 
    public string UserId { get; set; } 
    public System.DateTime StartDate { get; set; } 
    public System.DateTime EndDate { get; set; } 

    public AspNetUsers AspNetUsers { get; set; } 
} 

На мой взгляд, я хочу представить имя пользователя в AspNetUsers и две даты из UserSicknesses

<div class="form-group row"> 
    @Html.LabelFor(model => model.AspNetUsers.UserName, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-xs-10"> 
     @Html.EditorFor(model => model.AspNetUsers.UserName, new { htmlAttributes = new { @class = "form-control"} }) 
     @Html.ValidationMessageFor(model => model.AspNetUsers.UserName, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group row"> 
    @Html.LabelFor(model => model.StartDate, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-xs-10"> 
     @Html.EditorFor(model => model.StartDate, new { htmlAttributes = new { @class = "form-control", type = "date" } }) 
     @Html.ValidationMessageFor(model => model.StartDate, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group row"> 
    @Html.LabelFor(model => model.EndDate, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-xs-10"> 
     @Html.EditorFor(model => model.EndDate, new { htmlAttributes = new { @class = "form-control", type = "date" } }) 
     @Html.ValidationMessageFor(model => model.EndDate, "", new { @class = "text-danger" }) 
    </div> 
</div> 

Проблема сейчас заключается в том, что userSicknesses.AspNetUsers является Null при публикации и я не могу получить UserName. Они оба связаны с UserId, но я просто хочу получить UserName и две даты.

 [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "SicknessId,StartDate,EndDate,UserName")] UserSicknesses userSicknesses) 
    { 

     if (ModelState.IsValid && User.Identity.IsAuthenticated) 
     { 
      if (userSicknesses.StartDate > userSicknesses.EndDate) 
      { 
       ModelState.AddModelError("StartDate", "Das erste Datum kann nicht größer als das zweite sein!"); 
       return View(userSicknesses); 
      } 
      int sicId = 1; 

      // Just for testing purposes but userSicknesses.AspNetUsers is Null 
      string s = userSicknesses.AspNetUsers.UserName; 

      if (db.UserSicknesses.Any()) 
      { 
       sicId = (from a in db.UserSicknesses select a.SicknessId).Max() + 1; 
      } 
      userSicknesses.SicknessId = sicId; 

      userSicknesses.UserId = db.AspNetUsers.Where(u => u.UserName == userSicknesses.AspNetUsers.UserName).Select(u => u).FirstOrDefault().ToString(); 

      db.UserSicknesses.Add(userSicknesses); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(userSicknesses); 
    } 

в виде данных Firefox говорит мне: __RequestVerificationToken: KlY6b4CD41PaGoKJ ... AspNetUsers.UserName: админ StartDate: 2016-12-04 EndDate: 2016-12-18

Что утра Я делаю неправильно? Спасибо заранее.

кстати: это мой первый проект в asp.net, и я ценю каждый совет!

+0

Один из относительно простых способов - создать себе другую модель для этой цели. Эта модель должна содержать все поля, необходимые для обработки вашего запроса. –

+0

Это был бы один вариант. Но я нахожу это грязным? Я имею в виду, что моя модель «UserSicknesses» имеет переменную AspNetUsers, поэтому почему я не могу ее заполнить? – Licx

ответ

1

Проверить ниже код для передать этот результат:

$('#btnClick').on('click', function() { 
var UserSicknesses= { 
        "AspNetUsers.UserName": $("#AspNetUsers_UserName").val(), 
        "StartDate ": $("#StartDate").html(), 
        "EndDate": $("#EndDate").val() 

       }; 

       $.ajax({ 
        url: '/ControllerName/Create', 
        type: "Post", 
        async: false, 
        data: JSON.stringify(UserSicknesses), 
        dataType: "html", 
        contentType: "application/json;charset=utf-8", 
        success: function (result) { 
         $("#gdiv").empty(); 
         $("#gdiv").html(result); 

        } 
       }); 
    }); 
+0

К сожалению, это тоже не работает. – Licx

+0

измените свое действие следующим образом: chek: public ActionResult Create (UserSicknesses userSicknesses) –

+1

Wow теперь работает! Большое спасибо! Но мне интересно, почему «[Bind (Include =« SicknessId, UserId, StartDate, EndDate »)] необходимо удалить. – Licx

0

Я думаю, что вы можете использовать ViewModel, который содержит обе модели и передать его в представлении. check this answer, он очень похож на вашу проблему

Смежные вопросы