2013-05-04 1 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). Разница заключается в том, что обновление будет выдано, если есть ошибка проверки, тогда как TryUpdate просто установит значение IsValid равным false.

Дополнительным преимуществом использования UpdateModel является то, что пустая модель будет заполнена всеми значениями из коллекции форм для вас.

0

Вы должны установить ClientValidationEnabled, как истинного в вебе-конфигурации или добавить следующий код перед использованием BeginForm

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

получает сообщение об ошибке «не содержит определения для ClientValidationEnabled» – chamara

+1

Это означает, что вы не включили MicrosoftMvcJqueryValidation в свой проект. пожалуйста, обратитесь к наилучшему возможному secenario на http://blogs.msdn.com/b/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx – DeveloperBuddy