“Id”字段上的验证失败

时间:2013-02-26 16:50:03

标签: c# asp.net-mvc validation

我有一个简单的MVC模型:

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

    [Required(ErrorMessage = "Please provide a name for the blah blah blah")]
    public string Name { get; set; }
}

...我有一个像这样的观点(简化):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyName.Web.Models.SomeClassViewModel>" %>

<form method="post" action="/someclass/add">
    <%=Html.HiddenFor(m => m.SomeClass.Id)%>

    <div>
        <%=Html.LabelFor(m => m.SomeClass.Name)%>
        <%=Html.TextBoxFor(m => m.SomeClass.Name, new { @class = "form-medium" })%>
    </div>
</form>

在表单提交上,我的控制器验证ModelState,如此:

[HttpPost]
public ActionResult Add(Models.SomeClassViewModel model)
{
    if (ModelState.IsValid)
    {
        ...
    }
}

我得到

的模型验证错误
  

“Id字段是必需的。”

为什么会这样?

默认情况下Id字段被分配为0(应该如此),然后它将被传递到数据层以便创建记录,所以我看不出问题是什么?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果更改为Id变量的名称或将数据类型更改为字符串会怎样?

答案 1 :(得分:0)

确保Models.SomeClassViewModel类还具有相同类型和变量名称的Id字段。

如果不是这种情况,你也可以试试这个:

[HttpPost]
public ActionResult Add(SomeClass model)
{
    if (ModelState.IsValid)
    {
        ...
    }
}

答案 2 :(得分:0)

好的,所以我发现了问题。

在我的视图模型类('SomeClassViewModel')的构造函数中,我添加了一行代码,调用了'SomeClass'属性的默认构造函数。

我通过检查'Id'验证密钥的ModelState错误来解决这个问题,并看到'AttemptedValue'属性是一个空字符串,它应该是0.将此属性实例化为'SomeClass'的实例修好了。

我希望这可以帮助某人解决同样的问题!