Validation ModelState.IsValid应为true时返回false

Validation ModelState.IsValid应为true时返回false,validation,asp.net-mvc-2,Validation,Asp.net Mvc 2,我有一个非常简单的MVC2表单。它有两个下拉列表,用户和角色。“员工”下拉列表通过验证,而“角色”下拉列表不通过验证,无论我选择了什么。没有默认的“empty”选项,尽管我计划实现一个,这就是为什么我需要验证工作。它无法通过客户端和服务器验证。我就是不明白为什么一个人会工作而另一个人不工作 表格: <% using (Html.BeginForm()) {%> <%:Html.ValidationSummary(true) %> <%:Html.E

我有一个非常简单的MVC2表单。它有两个下拉列表,用户和角色。“员工”下拉列表通过验证,而“角色”下拉列表不通过验证,无论我选择了什么。没有默认的“empty”选项,尽管我计划实现一个,这就是为什么我需要验证工作。它无法通过客户端和服务器验证。我就是不明白为什么一个人会工作而另一个人不工作

表格:

<% using (Html.BeginForm()) {%>

    <%:Html.ValidationSummary(true) %>
    <%:Html.EditorFor(model => model.User, new { AllEmployees = Model.AllEmployees, RoleList = Model.RoleList })%>

    <p>
        <input type="submit" value="Add New User" />
    </p>

    <% } %>

<% Html.EndForm(); %>
获取操作:

    List<String> roles = (from o in txDB.Users
                                      select o.AccessLevel).Distinct().ToList(); 

    var viewModel = new UserViewModel
    {
        User = new User(),
        AllEmployees = empList,
        RoleList = roles
    };
    return View(viewModel);
所需的助手方法(来自):

公共静态字符串RequiredMarkFor(此HtmlHelper帮助程序,表达式)
{
if(ModelMetadata.FromLambdaExpression(expression,helper.ViewData).IsRequired)
返回“*”;
其他的
返回字符串。空;
} 

首先:您有两个结束表单标签

如果你使用

<% using (Html.BeginForm()) {%>
<% } %>

你不需要用这个

<% Html.EndForm(); %>

关于验证问题,您只对用户属性使用编辑器,而用户属性是唯一被模型绑定器绑定的属性

<%:Html.EditorFor(model => model.User, new { AllEmployees = Model.AllEmployees, RoleList = Model.RoleList })%>
model.User,新建{AllEmployees=model.AllEmployees,RoleList=model.RoleList})%>
尝试用EditorForModel替换前面的代码,因为编辑器模板是用于模型类的

所以你的表格应该在

<% using (Html.BeginForm()) {%>

    <%:Html.ValidationSummary(true) %>
    <table>
        <%:Html.EditorForModel()%>
    </table>
    <p>
        <input type="submit" value="Add New User" />
    </p>
<% } %>



你完了

Post方法应如下所示,以获得服务器端验证

[HttpPost]
[AuthorizeAttribute(Roles="Administrator")]
public ActionResult Create(User user)
{
    if(!TryUpdateModel(user))
    {
       // Model is INVALID
       return View(user);
    }
    else
    {
        // ModelState is VALID
        // Do stuff
    }
}
else
可能是多余的,这取决于您正在做什么,但这应该会让您继续。 在
上方的视图中,您需要

<% Html.EnableClientValidation(); %>


您还需要参考脚本MicrosoftAjax和MicrosoftMvcValidation,我认为

仅为用户使用编辑器的目的是因为视图使用viewmodel,以便允许我通过两个下拉列表。您是否建议我将视图强类型化给用户,并将列表传递给viewdata?您的视图将强类型化给ViewModel。EditorTemplate为这两个下拉列表创建html标记。如果只使用
Html.EditorFor(model=>model.User…
您告诉视图,即使传递了所有视图模型,也只需将一个属性绑定到视图中。我尝试了相同的效果。顺便说一句,感谢您指出了尾形冗余,但没有注意到。还有其他想法吗?我即将注释掉[Required]注释并继续:Pwhat's
RequiredMarkFor
?您还可以发布post方法的签名吗?奇怪的是,现在它似乎在服务器上验证,但在客户端上没有验证。TryUpdateModel在引用ModelState时如何工作?是的,所有脚本都被引用并添加了客户端验证,只是没有在t中显示出来代码。好的,我没有看到代码,所以我不想假设。TryUpdateModel只是一个我一直使用的方法,因为有人在这里向我建议它。
<%:Html.EditorFor(model => model.User, new { AllEmployees = Model.AllEmployees, RoleList = Model.RoleList })%>
<% using (Html.BeginForm()) {%>

    <%:Html.ValidationSummary(true) %>
    <table>
        <%:Html.EditorForModel()%>
    </table>
    <p>
        <input type="submit" value="Add New User" />
    </p>
<% } %>
[HttpPost]
[AuthorizeAttribute(Roles="Administrator")]
public ActionResult Create(User user)
{
    if(!TryUpdateModel(user))
    {
       // Model is INVALID
       return View(user);
    }
    else
    {
        // ModelState is VALID
        // Do stuff
    }
}
<% Html.EnableClientValidation(); %>