2016-12-07 63 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,它与您的问题非常相似