2013-05-04 111 views
0

我正在使用ASP.NET MVC 2.我的表单验证没有解雇。我无法弄清楚这里有什么问题。MVC验证没有解雇

型号:

public class Stock 
    { 
     public int StockID { get; set; } 

     [Required(ErrorMessage = "Please Select a Client")] 
     public int ClientID { get; set; } 

     [Required(ErrorMessage = "Please Select An Item")] 
     public int ItemID { get; set; } 


      [Required(ErrorMessage = "Please Enter Item Count")] 
      public int ItemCount { get; set; } 

      [Required(ErrorMessage = "Please Enter Item Price")] 
     public double Price { get; set; } 

      [Required(ErrorMessage = "Please Enter Other Expences")] 
     public double OtherExpences { get; set; } 

     public double TotalStockValue { get; set; } 

      [Required(ErrorMessage = "Please Enter Delivery date")] 
     public DateTime DeliveryDate { get; set; } 

     public string Description { get; set; } 
     public List<Client> lstClient { get; set; } 
     public IEnumerable<Item> lstItem { get; set; } 

     public string ClientName { get; set; } 
     public string ItemName { get; set; } 
    } 

控制器:

[HttpPost] 
     public ActionResult Create(FormCollection collection) 
     { 

       try 
       { 
        if (ModelState.IsValid) 
        { 
         StockRepository rep = new StockRepository(); 
         Stock stock = new Stock(); 
         stock.ClientID =Convert.ToInt32(Request.Form["ClientID"]); 
         stock.DeliveryDate =Convert.ToDateTime(Request.Form["DeliveryDate"]); 
         stock.Description = Request.Form["Description"]; 
         stock.ItemCount =Convert.ToInt32(Request.Form["ItemCount"]); 
         stock.ItemID =Convert.ToInt32(Request.Form["ItemID"]); 
         stock.Price =Convert.ToDouble(Request.Form["Price"]); 
         stock.OtherExpences = Convert.ToDouble(Request.Form["OtherExpences"]); 
         stock.TotalStockValue =Convert.ToDouble((stock.Price * stock.ItemCount)+stock.OtherExpences); 
         rep.Create(stock); 
         rep.Save(); 
         return RedirectToAction("Index"); 
        } 
        else 
         return View(); 
       } 
       catch 
       { 
        return View(); 
       } 

     } 

查看:

<%@ Page Title="" Language="C#" MasterPageFile="~/StockMasterPage.Master" Inherits="System.Web.Mvc.ViewPage<StockManagement.Models.Stock>" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Create 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<link rel="stylesheet" href="<%= Url.Content("http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css") %>" /> 
    <script src="<%= Url.Content("http://code.jquery.com/jquery-1.9.1.js") %>"></script> 
    <script src="<%= Url.Content("http://code.jquery.com/ui/1.10.3/jquery-ui.js") %>"></script> 

    <script> 
     $(function() { 
      $("#DeliveryDate").datepicker(); 
     }); 
    </script> 

    <h2>Create</h2> 

    <% using (Html.BeginForm()) {%> 
     <%: Html.ValidationSummary(true) %> 

     <fieldset> 
      <legend>Fields</legend> 
       <div class="editor-label"> 
       <%: Html.Label("Select Client")%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.DropDownListFor(x => x.ClientID, new SelectList(Model.lstClient, "ClientID", "Name"), "-- Please Select a Client --") %> 
       <%: Html.ValidationMessageFor(model => model.ClientID)%> 
      </div> 

      <div class="editor-label"> 
       <%: Html.Label("Select Item") %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.DropDownListFor(x => x.ItemID, new SelectList(Model.lstItem, "ItemID", "ItemName"), "-- Please Select an Item --")%> 
       <%: Html.ValidationMessageFor(model => model.ItemID)%> 
      </div> 


      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.ItemCount) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.ItemCount) %> 
       <%: Html.ValidationMessageFor(model => model.ItemCount) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Price) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Price) %> 
       <%: Html.ValidationMessageFor(model => model.Price) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.OtherExpences) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.OtherExpences) %> 
       <%: Html.ValidationMessageFor(model => model.OtherExpences) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.DeliveryDate) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.DeliveryDate) %> 
       <%: Html.ValidationMessageFor(model => model.DeliveryDate) %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Description) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextAreaFor(model => model.Description) %> 
       <%: Html.ValidationMessageFor(model => model.Description) %> 
      </div> 

      <p> 
       <input type="submit" value="Create" /> 
      </p> 
     </fieldset> 

    <% } %> 

    <div> 
     <%: Html.ActionLink("Back to List", "Index") %> 
    </div> 

</asp:Content> 

回答

0

前最后我得到了服务器端验证工作。 添加对UpdateModel或TryUpdateModel的调用,该调用将填充模型并启动正确设置ModelState.IsValid属性的验证规则。

[HttpPost] 
     public ActionResult Create(FormCollection collection) 
     { 

       try 
       { 
        Stock stock = new Stock(); 
        TryUpdateModel(stock); 

        if (ModelState.IsValid) 
        { 
         StockRepository rep = new StockRepository(); 

         stock.ClientID =Convert.ToInt32(Request.Form["ClientID"]); 
         stock.DeliveryDate =Convert.ToDateTime(Request.Form["DeliveryDate"]); 
         stock.Description = Request.Form["Description"]; 
         stock.ItemCount =Convert.ToInt32(Request.Form["ItemCount"]); 
         stock.ItemID =Convert.ToInt32(Request.Form["ItemID"]); 
         stock.Price =Convert.ToDouble(Request.Form["Price"]); 
         stock.OtherExpences = Convert.ToDouble(Request.Form["OtherExpences"]); 
         stock.TotalStockValue =Convert.ToDouble((stock.Price * stock.ItemCount)+stock.OtherExpences); 
         rep.Create(stock); 
         rep.Save(); 
         return RedirectToAction("Index"); 
        } 
        else 
         return View(); 
       } 
       catch 
       { 
        return View(); 
       } 

     } 

如果你的行动接受一个模型对象作为参数的内置了对MVC 2服务器端验证才起作用。这会导致MVC创建模型对象并自动将传入的表单输入值映射到它。作为此过程的一部分,它还将检查模型的DataAnnotation验证属性是否有效。如果一切都有效,那么我们代码中的ModelState.IsValid检查将返回true。

当你的行动接受的FormCollection这并不因此发生,DataAnnotation验证属性永远不会评估和ModelState.IsValid永远不会设置。我们可以自己简单地执行这些步骤来纠正这个问题。 MVC 2提供了我们可以用来执行此操作的函数(UpdateModel和TryUpdateModel)。区别在于,如果存在验证错误,Update将抛出,而TryUpdate将简单地将IsValid设置为false。

使用的UpdateModel的好处是,空模型将与形式集合大家的值来填充。

0

你应该已经建立ClientValidationEnabled真正在网络配置或添加以下代码使用BeginForm

<% Html.ClientValidationEnabled = true; %> 
+0

得到一个错误“不包含定义ClientValidationEnabled” – chamara 2013-05-04 07:15:19

+1

那说明你还没有包含在你的项目中MicrosoftMvcJqueryValidation。请参阅http://blogs.msdn.com/b/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx上的最佳可能场景 – DeveloperBuddy 2013-05-04 07:23:51