0

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

模型:

 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>
4

2 回答 2

0

您应该在 Web 配置中将ClientValidationEnabled设置为true或在使用 BeginForm 之前添加以下代码

 <% Html.ClientValidationEnabled = true; %>
于 2013-05-04T06:59:45.030 回答
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 的另一个好处是空模型将为您填充表单集合中的所有值。

于 2013-05-05T04:09:48.330 回答