2011-02-24 23 views
5

更新:如果您在JavaScript設置至少一個斷點,驗證開始工作,但沒有它不工作MVC 3客戶端驗證工作間歇

更新:加入jQuery的標籤,因爲這可以連接到驗證插件

我有MVC 3版本,System.Web.Mvc產品版本是:3.0.20105.0修改5th of Jan 2011 - 我認爲這是最新的。

我已經注意到,客戶端驗證無法正常工作,因爲它在我們創建的應用程序想,所以我做了一個快速測試。

我創建使用互聯網應用模板基本MVC 3應用。

我添加測試控制器:

using System.Web.Mvc; 
using MvcApplication3.Models; 

namespace MvcApplication3.Controllers 
{ 
    public class TestController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Create() 
     { 
      Sample model = new Sample(); 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(Sample model) 
     { 
      if(!ModelState.IsValid) 
      { 
       return View(); 
      } 

      return RedirectToAction("Display"); 
     } 

     public ActionResult Display() 
     { 
      Sample model = new Sample(); 
      model.Age = 10; 
      model.CardNumber = "1324234"; 
      model.Email = "[email protected]"; 
      model.Title = "hahah"; 

      return View(model); 
     } 
    } 
} 

型號:

using System.ComponentModel.DataAnnotations; 

namespace MvcApplication3.Models 
{ 
    public class Sample 
    { 
     [Required] 
     public string Title { get; set; } 

     [Required] 
     public string Email { get; set; } 

     [Required] 
     [Range(4, 120, ErrorMessage = "Oi! Common!")] 
     public short Age { get; set; } 

     [Required] 
     public string CardNumber { get; set; } 
    } 
} 

而且3次:

創建:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@*@{ Html.EnableClientValidation(); }*@ 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(false) 
    <fieldset> 
     <legend>Sample</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Title) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Age) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Age) 
      @Html.ValidationMessageFor(model => model.Age) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CardNumber) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CardNumber) 
      @Html.ValidationMessageFor(model => model.CardNumber) 
     </div> 

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

    @*<fieldset> 

     @Html.EditorForModel() 

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

    </fieldset> *@   
} 

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

顯示:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Display"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Display</h2> 

<fieldset> 
    <legend>Sample</legend> 

    <div class="display-label">Title</div> 
    <div class="display-field">@Model.Title</div> 

    <div class="display-label">Email</div> 
    <div class="display-field">@Model.Email</div> 

    <div class="display-label">Age</div> 
    <div class="display-field">@Model.Age</div> 

    <div class="display-label">CardNumber</div> 
    <div class="display-field">@Model.CardNumber</div> 
</fieldset> 
<p> 
    @Html.ActionLink("Back to List", "Index") 
</p> 

指數:

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create", "Create") 
</p> 

<p> 
    @Html.ActionLink("Display", "Display") 
</p> 

一切都默認在這裏 - 創建控制器,從控制器動作AddView與模型適當腳手架模板指定並使用樣本應用程序中提供的佈局。

當我會去/測試/創建在大多數情況下客戶端驗證僅適用於TitleAge領域,點擊創建它適用於所有領域後(創建不進入服務器)。

然而,在某些情況下(以後構建)Title驗證是沒有工作,Email是,或CardNumberTitleCardNumberEmail不是。但從來沒有全部驗證一下創建前的工作。

我試着創建與Html.EditorForModel形式以及強制執行客戶端驗證只是BeginForm前:

@{ Html.EnableClientValidation(); } 

providing a source code for this sample on dropbox - 因爲也許我們的開發ENV被打破:/我做了測試,在IE瀏覽器8和Chrome 10 beta。

以防萬一,在web配置驗證腳本已啓用:

<appSettings> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings> 

所以我的問題是

有沒有一種方法,以確保客戶端驗證將工作,因爲它應該工作,不是間歇性的?

這是一個理想的行爲,我在配置/實現中丟失了一些東西?

更新:如果您在JavaScript設置至少一個斷點,驗證開始工作,但沒有它不工作

更新:加入jQuery的標籤,因爲這可以連接到驗證插件

+1

這也發生在我身上......任何解決方案? – cecilphillip 2012-03-24 03:53:26

回答

0

使用不引人注目的驗證時 - 實時客戶端驗證僅在首次提交後纔有效。在首次執行表單的客戶端驗證之前(只需單擊提交)即可對未初始化且不工作的字段進行實時驗證。

+0

是的,但對於某些字段,點擊提交之前實時驗證正在工作。有時是一個領域,有時幾乎所有領域,但從來都不是。 – Gutek 2011-02-24 15:03:46

+0

downvote,因爲雖然這是正確的,但它不是OP有 – roo2 2015-05-20 06:39:19

-1

將腳本引用放入文檔<head>。在執行腳本並驗證連接時,可能存在計時問題。

+0

它有點幫助的問題。它不能實時工作,但如果我將使用表單進行足夠長的時間,並且有時會在文本字段中進行雙重退格,我可以強制所有文本字段進行驗證。但是這仍然不能解決問題,因爲我需要付出巨大的努力作爲用戶獲取驗證信息(太多的努力 - 點擊,選項卡,雙退格鍵,刪除直到它會觸發 - 基本上我需要輸入字段並添加/刪除文本乘法時間以觸發中的腳本)。 – Gutek 2011-02-25 16:38:53

+0

客戶端驗證基於jQuery驗證插件。這種行爲是通過設計 - 「在一個字段被標記爲無效之前,驗證是懶惰的:在第一次提交表單之前,用戶可以通過字段選擇而不會收到令人討厭的消息 - 在他擁有實際輸入正確值的機會「 - http://docs.jquery.com/Plugins/validation。如果點擊提交會導致驗證,它正常工作。 – hwiechers 2011-02-25 16:59:47

+0

好的,但爲什麼會在開始時在某些領域工作?即。對於Age,它始終在提交之前運行,用戶將收到有關驗證錯誤的消息。對於其他字段也是如此,但它對於同一組字段無效 - 有時在提交之前它僅適用於Age,有時它在提交之前適用於Title和Age。它適用於所有的領域,如果你將在例如FireBug的JS中設置一個斷點。它不應該像那樣工作 - 如果它在提交之前不應該工作而不應該工作 - 但它是有效的。這讓用戶感到困惑 – Gutek 2011-02-25 17:06:03