在mvc4应用程序中,模型状态错误“需要Id字段”

时间:2015-03-26 15:24:02

标签: asp.net-mvc asp.net-mvc-4

我在创建视图中使用了一个viewmodel。每件事都有效,但是在表格帖子中通过jquery我得到The Id field is required ModelState错误。我已经看到了一些关于在模型类中添加[Bind(Exclude = "Id")]注释的解决方案,但是当我在Update模型上调用相同的操作方法时,它从不绑定模型的Id并在db中插入新记录。

我的viewmodel看起来像

public class MemberSiteContactModel
{
    public int Id { get; set; }

    [Display(Name = "Name")]
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }

    // More items

 }

我的部分视图看起来像

@model MemberSiteContactModel

<tr class="highlight">
<td class="col-sm-1">@Html.TextBoxFor(x => x.Name, new { @class = "name" })</td>
<td class="col-sm-2">@Html.TextBoxFor(x => x.ContactNo, new { @class = "contactNo" })</td>
<td class="col-sm-1"><input type="button" class="btn btn-xs btn-success contactSaveRow" value="Save" /></td>
<td class="col-sm-1"><input type="button" class="btn btn-xs btn-danger contactDeleteRow" value="Remove" name="btnRemoveContact" /></td>
</tr>

我的控制器看起来像

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveSiteContact(MemberSiteContactModel memberSiteContactModel)
{
        if (ModelState.IsValid)
        {
        //processing
         }
}

我还创建了一个示例应用程序来复制行为

public class CityModel
{
    public int Id { get; set; }

    [Display(Name = "City")]
    [Required(ErrorMessage = "City is required")]
    public string City { get; set; }
}

public ActionResult Contact()
    {
        return View();
    }

@model WebApplication3.Models.CityModel

@using (@Html.BeginForm("SaveCity", "Home", FormMethod.Post))
  {
    @Html.HiddenFor(x => x.Id)
    @Html.TextBoxFor(x => x.City)

    <input type="submit" value="Submit" />
  }

[HttpPost]
 public ActionResult SaveCity(CityModel cityModel)
 {
    if (ModelState.IsValid)
     {

     }
        return null;
  }

2 个答案:

答案 0 :(得分:1)

您没有传入ID,您需要添加一个隐藏字段,该字段保存为Id,否则ID将如何传递到已发布的模型中。

@Html.HiddenFor(x => x.Id)

答案 1 :(得分:0)

我使用MVC并遇到同样的问题,所以我查看了我的所有创建代码,发现我在调用时没有向View发送空模型。解决方案很简单;在Create()操作结果上,只需添加一行创建新的ViewModel并将其设置为View或Partial View返回的参数。像这样:

public ActionResult Create(){
    ViewModel entity = new ViewModel();
    return PartialView(entity);
}

我希望有所帮助。