2016-12-07 64 views
1

我在ADO.NET實體數據模型中有兩個鏈接模型。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發佈時爲空我無法接收用戶名。 它們都通過UserId連接,但我只想獲取用戶名和兩個日期。

 [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:管理員 開始日期:2016年12月4日 結束日期:二○一六年十二月一十八日

上午什麼我做錯了? 預先感謝您。

btw:這是我在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創建(UserSicknesses userSicknesses) –

+1

哇現在它的工作!非常感謝你!但我想知道爲什麼「[綁定(包括=」SicknessId,UserId,StartDate,EndDate「)]」需要刪除.. – Licx

0

我想你可以使用包含這兩種模型視圖模型,並把它傳遞給視圖。 check this answer,它與您的問題非常相似