2013-05-04 4 views
0

J'utilise ASP.NET MVC 2. Mes validations de formulaire ne se déclenchent pas. Je ne peux pas comprendre ce qui ne va pas ici.Les validations MVC ne se déclenchent pas

Modèle:

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; } 
    } 

Controller:

[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(); 
       } 

     } 

Vue:

<%@ 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> 

Répondre

0

Enfin je suis arrivé du côté du serveur de travail de validation. Ajoutez un appel à UpdateModel ou TryUpdateModel qui remplira votre modèle et déclenchera correctement les règles de validation définissant la propriété 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(); 
       } 

     } 

Construit dans la validation côté serveur pour MVC 2 ne fonctionnera que si votre action accepte un objet de modèle en tant que paramètre. Cela provoque MVC pour créer l'objet de modèle et mapper automatiquement les valeurs d'entrée de formulaire entrant à il. Dans le cadre de ce processus, il vérifiera également si les attributs de validation DataAnnotation pour le modèle sont valides. Si tout est valide, la vérification ModelState.IsValid dans notre code retournera vrai. Lorsque votre action accepte une FormCollection, cela ne se produit pas, les attributs de validation DataAnnotation ne sont jamais évalués et ModelState.IsValid n'est jamais défini. Nous pouvons corriger ce problème en effectuant simplement ces étapes nous-mêmes. MVC 2 fournit des fonctions que nous pouvons utiliser pour cela (UpdateModel et TryUpdateModel). La différence est mise à jour lancera s'il y a une erreur de validation alors que TryUpdate va simplement définir l'IsValid à false.

Un avantage supplémentaire de l'utilisation de UpdateModel est qu'un modèle vide sera rempli avec toutes les valeurs de la collection de formulaires pour vous.

0

Vous devriez avoir mis ClientValidationEnabled comme vrai dans la configuration web ou ajouter du code ci-dessous avant d'utiliser BeginForm

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

obtient une erreur «ne contient pas de définition pour ClientValidationEnabled» – chamara

+1

Cela signifie que vous n'avez pas inclus MicrosoftMvcJqueryValidation dans votre projet. Veuillez vous référer au meilleur secenario possible sur http://blogs.msdn.com/b/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx – DeveloperBuddy

Questions connexes