验证作为MVC3 ViewModel属性的列表的TextBox输入

时间:2012-02-12 22:49:35

标签: asp.net-mvc-3 client-side-validation asp.net-mvc-validation

我意识到我参加派对的时间有点晚了,但是......我正在参与我的第一个MVC项目,并且能够处理大部分需要做的事情。大多数项目只是读取数据并将数据泵入图表。但是,我有一个View,其模型看起来像这样(父类属性在这里不重要):

public class Class1 : ParentClass
{
public List<ChildClass> ChildClassList{get;set;}
}

,ChildClass看起来像这样:

public class ChildClass
{
   public int Property1{get;set;}
   public int Property2{get;set;}
   public string Property3{get;set;}

   public int? ID{get;set;}
   [Editable(true)]
   public decimal? Property4{get;set;}
}

现在,检索数据不是问题。我可以循环遍历列表,并创建一个表格进行编辑,如下所示:

<% foreach(var g in Model.ChildClassList){%>
   <tr>
     <td style="text-align: right;">
    <%= Html.Label(g.Property3)%>
 </td>
     <td>
        <%=Html.TextBox(Model.ParentProperty.ToString() + "_" + g.Property2, (g.Property4.HasValue ? g.Property4.Value.ToString("C") : "$0.00"))%>
     </td>
   </tr>
<% }%>

在这个网站巡航过去几天之后,我突然意识到我可以在POST方法中验证服务器端的输入(表单底部有一个“保存”按钮) ,但(a)如何将验证错误消息反馈给用户,(b)执行验证客户端?。

我还必须提到这个视图使用列表中的值来创建图表的一部分,然后再渲染为表格。

1 个答案:

答案 0 :(得分:0)

[HttpPost]操作的服务器端,您可以检查模型的有效性,如下所示:

[HttpPost]
public ActionResult Save(Class1 model)
{
   if (!ModelState.IsValid)
      return View(model);
   // Code to save model.
}

您还需要更新视图以显示错误:

<%= Html.ValidationSummary(false, "Please fix these errors.")
<% foreach(var g in Model.ChildClassList){%>
   <tr>
     <td style="text-align: right;">
    <%= Html.Label(g.Property3)%>
 </td>
     <td>
        <%=Html.TextBox(Model.ParentProperty.ToString() + "_" + g.Property2, (g.Property4.HasValue ? g.Property4.Value.ToString("C") : "$0.00"))%>
        <%= Html.ValidationMessageFor(model => g.Property4)
     </td>
   </tr>
<% }%>

如果要在客户端启用它,则需要使用不引人注目的客户端验证,您可以通过更新web.config来执行此操作:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>

您还需要以下JS库:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"           type="text/javascript"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js"      type="text/javascript"></script>
<script src="//ajax.microsoft.com/ajax/jQuery.Validate/1.7/jQuery.Validate.min.js" type="text/javascript"></script>
<script src="//ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

在旁注上,请尝试避免循环以渲染视图。这是不必要的代码汤,可以通过使用编辑器模板来避免。