2011-08-02 28 views
0

我試圖實現的Razor Html Helper中有一個特別有趣的問題。此幫助程序的目標是接受System.Type,從該Type的屬性和關聯屬性生成一個JQuery驗證表單,並返回一個JavaScript字符串,該字符串將在運行時用作所生成表單的驗證規則。我通過重複調用@ Html.Raw()來生成表單,並在遍歷屬性和屬性時構建它。最初,html helper是寫在將要使用它的唯一文件中,但由於這是一個廣義和常用的幫助器,我已將它移到我的項目中的App_Code文件夾中。從MVC 3 Razor Html Helper中檢索數據

這就是問題:我發現ViewData不適用於當這個幫助器在App_Code中時從輔助器返回任何數據。本來,我有兩個助手;一個用於在ViewData中生成表單和松鼠JavaScript字符串,另一個用於獲取相同的JavaScript字符串並將其打印到客戶端腳本塊中的文檔中。我希望這個幫助器不僅可以生成表單,還可以通過一次傳遞給我這個JavaScript字符串,因此不必重複O(n)工作。

原僞代碼:

@helper MakeFormAndValidationRule(Type) 
{ 
    //generate form 
    //write form using @Html.Raw() 
    //generate validation rules simultaneously 
    //store validation rules in ViewData 
} 

@helper WriteValidationRules() 
{ 
    @Html.Raw(ViewData["rules"]); 
} 

<form> 
    MakeFormAndValidationRule(Type) 
</form> 
<script> 
    form.validate(@WriteValidationRules()) 
</script> 

的問題:什麼是「最佳實踐」爲這些類型的案件?我可以將驗證規則寫入DOM以供以後檢索,並在運行時使用JQuery魔術將其取出,但是如果有更好,更清晰的方法來執行此操作,我想知道。

回答

0

ViewData是模型的一部分,您應該使用自定義HTML幫助程序,而不是Razor幫助程序。

事情是這樣的:

public static MvcHtmlString MakeFormAndValidationRule<TModel>(this HtmlHelper<TModel> helper, Type type) 
{ 
    var viewData = helper.ViewData; 

    // Your code... 
} 

More info on custom HTML helpers.

另外,我不認爲你應該產生一個完整的形式和驗證與助手。這是太多的責任。

請考慮將責任分隔到custom editor template