Asp.net-Mvc

MVC5 - 數據註釋 - 客戶端驗證未發生?

  • January 7, 2016

我有一個 MVC 5 應用程序,並且我正在使用數據註釋進行大部分驗證。我班級中的一個屬性如下所示:

[Required(ErrorMessage = "Please enter a business name")]
[StringLength(80)]
public string BusinessName { get; set; }

驗證正在工作,但它似乎並沒有像我認為的那樣在瀏覽器中發生。在我的頁面上,我有一個保存按鈕。如果我將“業務名稱”欄位留空並點擊“保存”,則會向控制器方法發送一個文章,該方法部分看起來如下:

   [HttpPost]
   public ActionResult Create(Advertiser advertiser, FormCollection collection, HttpPostedFileBase file)
   {
       // Before we do anything, let's check to make sure any validation that's already been done is clean.
       if (!ModelState.IsValid)
       {
           return View(advertiser);
       }
  ...
  ...
}

執行此方法時,模型狀態已設置為無效。這很好,因為它是無效的,因為 Business Name 欄位是空的。但是,這種驗證不應該發生在客戶端嗎?

我的 .cshtml 文件中的欄位如下所示(使用 Bootstrap):

<div class="form-group">
   @Html.Label("Business Name", new { @class = "control-label col-md-3" })
   <div class="col-md-9">
       @Html.TextBoxFor(model => model.BusinessName, new { @class = "form-control", title = "", autofocus = true })
       @Html.ValidationMessageFor(model => model.BusinessName)
   </div>
</div>

我的 Web.Config 正確設置如下:

<appSettings>
   <add key="webpages:Version" value="3.0.0.0" />
   <add key="webpages:Enabled" value="false" />
   <add key="ClientValidationEnabled" value="true" />
   <add key="UnobtrusiveJavaScriptEnabled" value="true" />
 </appSettings>

我發現了我的問題。在我的 BundleConfig.cs 我有以下內容:

   bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
               "~/Scripts/jquery-{version}.min.js",
               "~/Scripts/jquery-ui-1.10.4.min.js",
               "~/Scripts/jquery.base64.js"
               ));

   bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
               "~/Scripts/jquery.validate.min.js",
               "~/Scripts/jquery.validate.unobtrusive.min.js"
               ));

但是,我沒有意識到 jqueryval 包預設不會載入到 _Layout.cshtml 文件中。所以我需要添加它,如下:

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)

一旦我這樣做了,它就可以正常工作了。當然,這將導致它為所有頁面載入。這可能是不可取的。如果沒有,請根據需要在每個頁面中單獨載入。

引用自:https://stackoverflow.com/questions/28366314