Validation 带有数据批注的MVC 2客户端和服务器验证-要求不起作用

Validation 带有数据批注的MVC 2客户端和服务器验证-要求不起作用,validation,asp.net-mvc-2,data-annotations,partial-views,Validation,Asp.net Mvc 2,Data Annotations,Partial Views,我有一个Create视图,它传递了一个ViewModel。ViewModel包含以下内容: namespace MyProject.ViewModels { public class MyObjectCreateView { public MyObject MyObject { get; set; } public List<OtherObject> OtherObjects { get; set; } } } 等等 我的创建

我有一个Create视图,它传递了一个ViewModel。ViewModel包含以下内容:

namespace MyProject.ViewModels
{
    public class MyObjectCreateView
    {
        public MyObject MyObject { get; set; }
        public List<OtherObject> OtherObjects { get; set; }
    }
}
等等

我的创建视图如下所示:

<% Html.EnableClientValidation(); %>

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

    <%:Html.ValidationSummary(true, "Please fix the following errors:") %>
    <%:Html.EditorFor(model => model.MyObject) %>

    <p>
        <input type="submit" value="Save" />
    </p>

    <% } %>

<div>
    <%:Html.ActionLink("Back to List", "Index") %>
</div>
以及异常堆栈跟踪:

at System.Data.Objects.DataClasses.StructuralObject.SetValidValue(String value, Boolean isNullable)
   at MyProject.Models.MyObject.set_Title(String value) in C:\CodeProjects\MyProject\Models\MyProjectDB.Designer.cs:line 4941

关于您的代码的几点意见:

  • 您说您有一个视图模型,但我看到的更像是一个实体框架自动生成的模型。类型对象的属性。。。啊
  • 您包括
    MicrosoftMvcValidation.js
    MicrosoftMvcJQueryValidation.js
    ,但它们是互斥的。您必须决定是否使用MS技术或插件进行客户端验证

  • 您没有显示控制器操作的任何代码,也没有显示所获得的确切异常堆栈跟踪。您是说Post操作未命中,但您得到了一个异常。这个异常是从哪里来的?

    Hmm…我认为viewmodel有点不必要-你能详细说明一下吗?我将用控制器操作和异常堆栈更新这个问题。异常发生在EF生成的EDMX文件中。是的,我意识到我已经这样做了,并取出了Ajax脚本。现在只有jquery-1.4.1.min.js、jquery.validate.min.js、microsoftmvcjqueryvalidation.jsI找到了发布到microsoft的反馈。这正是我得到的结果,尽管我使用viewmodel将数据传递到视图中。值得注意的是,viewmodel的原因最终是我将在将来的版本中添加将其他对象添加到创建视图列表中的功能。终于找到了解决方案。
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TxRP.Models.MyObject>" %>
    <%--EditorTemplate--%>
    
    <fieldset>
        <div class="editor-label"><%:Html.LabelFor(model => model.MyObjectId)%></div>
        <div class="editor-field">
            <%:Html.TextBoxFor(model => model.MyObjectId)%>
            <%= Html.ValidationMessageFor(model => model.MyObjectId) %>
        </div>           
    
        <div class="editor-label"><%:Html.LabelFor(model => model.Title)%></div>
        <div class="editor-field">
            <%:Html.TextAreaFor(model => model.Title, new { cols = "80" })%>
            <%= Html.ValidationMessageFor(model => model.Title)%>
        </div>
    
    <script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
    <script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
    <script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript"></script>
    <script src="../../scripts/jquery-1.4.1.min.js" type="text/javascript"></script>  
    <script src="../../Scripts/ui/minified/jquery.ui.core.min.js" type="text/javascript"></script>  
    <script src="../../Scripts/ui/minified/jquery.ui.datepicker.min.js" type="text/javascript"></script>  
    
    <link href="../../Content/Site.css" type="text/css" rel="Stylesheet" />  
    <link href="../../Content/jquery-ui/sunny/jquery-ui-1.8.4.custom.css" type="text/css" rel="Stylesheet" /> 
    
    public ActionResult Create(MyObject myObject)
    {
        if (!ModelState.IsValid) 
        {
            //ModelState is invalid
            return View(new MyObject());
        }
        try
        {
            //TODO: Save MyObject
    
            return RedirectToAction("Index");
        }
        catch
        {
            //Invalid - redisplay with errors
    
            return View(new MyObject());
        }           
    }
    
    at System.Data.Objects.DataClasses.StructuralObject.SetValidValue(String value, Boolean isNullable)
       at MyProject.Models.MyObject.set_Title(String value) in C:\CodeProjects\MyProject\Models\MyProjectDB.Designer.cs:line 4941