2011-05-25 27 views
2

客戶端驗證,我在我的應用程序啓用不顯眼的客戶端驗證,我有這個模型(類似的東西):ASP.NET MVC 3不顯眼的動態內容

public class MyModel 
{ 
    [Required] 
    public string Name { get; set; } 

    [Range(0, 100)] 
    public int? Age { get; set; } 
} 

我有以下/首頁/索引視圖:

@model MyModel 

@using (Html.BeginForm("Test", "Home")) 
{ 
    <div id="my-form"> 
     @Html.Partial("Model") 
    </div> 
    <input type="submit" value="Go" /> 
} 

隨着部分 「模式」:

@model MyModel 

<div> 
    @Html.LabelFor(x => x.Name) 
    @Html.TextBoxFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
</div> 
<div> 
    @Html.LabelFor(x => x.Age) 
    @Html.TextBoxFor(x => x.Age) 
    @Html.ValidationMessageFor(x => x.Age) 
</div> 

一切都是白鬼,嘟嘟,我得到很好的驗證錯誤信息。

現在我想加載窗體/部分「模型」動態,即遠程的@ Html.Partial並添加以下內容:

<a href="#" id="load-form">Load the form</a> 

<script type="text/javascript"> 
    $(function() { 
     $("#load-form").click(function() { 
      $.post(
       "/Home/Test", 
       null, 
       function (result) { 
        $("#my-form").html(result); 
        $.validator.unobtrusive.parse($("#my-form")); 
       }, 
       "html"); 
     }); 
    }); 
</script> 

凡/首頁/測試是return Partial("Model", new MyModel());

一樣簡單

但現在的客戶端驗證不再工作了,如果我看着DOM和HTML返回數據 - 屬性呈現,即:

使用H tml.Partial()在/ home /索引

<div>  
    <label for="Name">Name</label>  
    <input data-val="true" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" />  
    <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>  
</div>  
<div>  
    <label for="Age">Age</label>  
    <input data-val="true" data-val-number="The field Age must be a number." data-val-range="The field Age must be between 0 and 100." data-val-range-max="100" data-val-range-min="0" id="Age" name="Age" type="text" value="" />  
    <span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true"></span>  
</div> 

XHR響應

<div> 
    <label for="Name">Name</label> 
    <input id="Name" name="Name" type="text" value="" />   
</div> 
<div> 
    <label for="Age">Age</label> 
    <input id="Age" name="Age" type="text" value="" />  
</div> 

即使我明確驗證的東西是不會呈現局部視圖中添加Html.EnableClientValidation();Html.EnableUnobtrusiveJavaScript();

如何讓我的AJAX部分呈現驗證屬性和消息?或者我還能做什麼錯?

回答

1

啊...... :)簡單

@Html.BeginForm()必須在同一個部分(我的猜測是不夠公平的,因爲我們是在窗體上驗證),所以:

/首頁/索引角度的:

@model MyModel 

<div id="my-form"> 
    @Html.Partial("Model") 
</div> 

隨着部分 「模式」:

@model MyModel 

@using (Html.BeginForm("Test", "Home")) 
{ 
    <div> 
     @Html.LabelFor(x => x.Name) 
     @Html.TextBoxFor(x => x.Name) 
     @Html.ValidationMessageFor(x => x.Name) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.Age) 
     @Html.TextBoxFor(x => x.Age) 
     @Html.ValidationMessageFor(x => x.Age) 
    </div> 

    <input type="submit" value="Go" /> 
} 
+2

任何想法,如果你不能把Html.BeginForm放在相同的部分,你會怎麼做這個工作? (例如,如果你是添加一個集合的子實體) – 2011-08-10 17:18:49

+0

沒有不幸的是,實際情況也增加了一個集合,並沒有真正找到解決方案... – veggerby 2011-08-10 21:48:18

+1

認爲我們想通了: - http://堆棧溢出。com/questions/7015526/asp-net-mvc-3-unobtrusive -jquery-client-side-validation-with-child-collections – 2011-08-10 21:53:54

1

你不需要個在你的偏好中形成一種形式(有時候這種優勢可以保持不變,例如, ajax形式,而不必在每次加載時重新綁定到新的表單)。

在你的部分只需添加

{ ViewContext.FormContext = new FormContext()} 

和屬性將被寫出來。