0

我意识到我参加聚会有点晚了,但是……我正在从事我的第一个 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)执行验证客户端?

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

4

1 回答 1

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>

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

于 2012-02-12T23:15:08.380 回答