2012-03-03 69 views
4

我有一個非常奇怪的問題與不顯眼的驗證。不顯眼的驗證不工作在一些元素

我有三個stirng屬性的必需屬性的模型。我爲兩個字段使用TextBoxFor,最後使用TextAreaFor。驗證工作在TextArea上,但不在輸入字段上。查看源代碼,我可以看到驗證添加的屬性不在輸入上,而是在文本框上。另外,如果我將數據輸入到文本框並提交,它將發佈和MVC模型綁定DOES正確地將ModelState.IsValid設置爲false,並且ValidationSummary顯示這些字段。

什麼會導致驗證不起作用的輸入元素?

型號:

public class TestModel : IEmail { 
     public string BCCAddresses { 
      get; 
      set; 
     } 

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

     public string CCAddresses { 
      get; 
      set; 
     } 

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

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

查看:

@section head { 
    <script src="@Url.Content("~/Scripts/jquery.1.7.1.min.js")" type="text/javascript"></script> 
    <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(); 
    Html.EnableUnobtrusiveJavaScript(); 
} 

      @using (Html.BeginForm("Edit", "Email", FormMethod.Post)) { 
       <table> 
        <tr> 
         <td>From</td> 
         <td>@Html.TextBoxFor(x => x.FromAddress, new { style = "width: 500px;" })</td> 
        </tr> 
        <tr> 
         <td>CC</td> 
         <td>@Html.TextBoxFor(x => x.CCAddresses, new { style = "width: 500px;" })</td> 
        </tr> 
        <tr> 
         <td>BCC</td> 
         <td>@Html.TextBoxFor(x => x.BCCAddresses, new { style = "width: 500px;" })</td> 
        </tr> 
        <tr><td colspan="2">&nbsp;</td></tr> 
        <tr> 
         <td colspan="2">Subject Line</td> 
        </tr> 
        <tr> 
         <td colspan="2">@Html.TextBoxFor(x => x.SubjectLineFormat, new { style = "width: 500px;" })</td> 
        </tr> 
        <tr><td colspan="2">&nbsp;</td></tr> 
        <tr> 
         <td colspan="2">Body Form</td> 
        </tr> 
        <tr> 
         <td colspan="2">@Html.TextAreaFor(x => x.BodyFormat, new { style = "width: 500px; height: 200px" })</td> 
        </tr> 
        <tr><td colspan="2">&nbsp;</td></tr> 
        <tr> 
         <td colspan="2"> 
          <input id="ApplyChanges" type="submit" class="NavigationButton" value="Save Changes" /> 
          <input id="CancelChanges" type="button" class="NavigationButton" value="Cancel Changes" /> 
         </td> 
        </tr> 
        <tr> 
         <td colspan="2"> 
          @Html.ValidationSummary() 
         </td> 
        </tr> 
        <tr><td colspan="2">&nbsp;</td></tr> 
       </table> 
      } 

瀏覽器源:

<form action="/url" method="post"> 
       <table> 
        <tbody><tr> 
         <td>From</td> 
         <td><input style="width: 500px;" id="FromAddress" name="FromAddress" value="" type="text"></td> 
        </tr> 
        <tr> 
         <td>CC</td> 
         <td><input style="width: 500px;" id="CCAddresses" name="CCAddresses" value="" type="text"></td> 
        </tr> 
        <tr> 
         <td>BCC</td> 
         <td><input style="width: 500px;" id="BCCAddresses" name="BCCAddresses" value="" type="text"></td> 
        </tr> 
        <tr><td colSpan="2">&nbsp;</td></tr> 
        <tr> 
         <td colSpan="2">Subject Line</td> 
        </tr> 
        <tr> 
         <td colSpan="2"><input style="width: 500px;" id="SubjectLineFormat" name="SubjectLineFormat" value="" type="text"></td> 
        </tr> 
        <tr><td colSpan="2">&nbsp;</td></tr> 
        <tr> 
         <td colSpan="2">Body Form</td> 
        </tr> 
        <tr> 
         <td colSpan="2"><textarea style="width: 500px; height: 200px;" id="BodyFormat" cols="20" rows="2" name="BodyFormat" data-val-required="The BodyFormat field is required." data-val="true"></textarea></td> 
        </tr> 
        <tr><td colSpan="2">&nbsp;</td></tr> 
        <tr> 
         <td colSpan="2"> 
          <input id="ApplyChanges" class="NavigationButton" disabled="disabled" value="Save Changes" type="submit"> 
          <input id="CancelChanges" class="NavigationButton" value="Cancel Changes" type="button"> 
         </td> 
        </tr> 
        <tr> 
         <td colSpan="2"> 
          <div class="validation-summary-valid" data-valmsg-summary="true"><ul><li style="display: none;"></li> 
</ul></div> 
         </td> 
        </tr> 
        <tr><td colSpan="2">&nbsp;</td></tr> 
       </tbody></table> 
</form> 
+0

你能告訴我們一些相關的代碼嗎? – 2012-03-03 01:41:54

+0

@ChaseFlorell新增 – Andy 2012-03-03 01:59:27

+0

我們來看看瀏覽器的查看源代碼。 – Jed 2012-03-03 02:13:41

回答

1

我進行一個快速測試,幾乎你相同的示例代碼和驗證工作正常上我的結局。我會開始剝離物品,直到找到與驗證有衝突的地方。

對於這裏引用就是我的測試看起來像:

控制器

public ActionResult Index() 
{ 
    var model = new TestModel(); 
    return View("Index", model); 
} 

測試模式,我用沒有從 「IEmail」 繼承:

public class TestModel 
{ 
    public string BCCAddresses 
    { 
     get; 
     set; 
    } 

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

    public string CCAddresses 
    { 
     get; 
     set; 
    } 

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

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

我的觀點非常相似。請注意,我沒有爲腳本庫實現一節,而是直接在w視圖中引用它們。 EG:

<script src="@Url.Content("~/Scripts/jquery.1.7.1.min.js")" type="text/javascript"></script> 
<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> 

希望這會有所幫助。

+1

就是這樣。如果我將@Model指令更改爲我正在使用的具體類型,它工作正常。所以看起來使用模型的接口會導致某些工作不正確。謝謝你的幫助! – Andy 2012-03-03 03:25:57

+0

@安迪 - 有趣!所以,如果您將數據註釋添加到您的IEmail屬性,那麼** data-val **屬性是否會按照您預期的方式生成,或者問題是否仍然存在?我的猜測是可行的,但鑑於你的textarea得到了一個** data-val **屬性並且你的輸入不是,讓我懷疑你是否發現了一個模型綁定器的bug(或者它是什麼使所有神奇的發生)。我也很好奇,如果你傳遞一個IEmail或TestModel對象到View方法(即**返回視圖(myIEmail)**)或者你只是調用視圖沒有參數(即**返回視圖()**) ? – Jed 2012-03-03 08:07:29

+0

@Jed,我沒有試過,因爲並不是所有的實現都有相同的規則。我使用的是View(「ViewName」,ConcreteModel)。即使在我將視圖更改爲具體類型之前,將TextBoxFor更改爲TextAreaFor也會導致驗證生效。 – Andy 2012-03-03 14:55:40

相關問題