2011-09-28 80 views
3

我有一個註冊頁面,它向用戶請求一些數據,例如,電子郵件地址。管理員應該能夠自定義表單。例如,他可能對用戶的出生地感興趣,在這種情況下,註冊表中應該出現一個額外的文本框。將驗證器的輸入控件動態添加到視圖

由於表單中的字段非常動態,因此我無法將這些屬性添加到視圖模型中。在運行時如何將輸入控件和驗證器添加到視圖中?

+0

[用於動態視圖數據/窗體的ASP.Net MVC編輯器模板](http://stackoverflow.com/questions/7403799/asp-net-mvc-editor-template-for-dynamic-view-data-forms) – Sjoerd

+0

[ASP.NET MVC自定義ModelMetadataProvider和ModelValidatorProvider](http://stackoverflow.com/questions/4602339/asp-net-mvc-custom-modelmetadataprovider-and-modelvalidatorprovider) – Sjoerd

+0

[使用Mono編譯器的動態ASP.NET MVC 3模型作爲服務](http://weblogs.asp.net/jgalloway/archive/2011/05/26/dynamic-asp-net-mvc-3-models-using-mono-s-compiler-as-a-service的.aspx) – Sjoerd

回答

1

您可以使用集合爲動態表單創建模型類。例如:

public class MyParam { 
    public string Name {get; set;} 
    public string Value{get; set;} 
} 

public class MyDynamicForm { 
    public List<MyParam> parameters {get; set;} 
} 

比你可以創建一個視圖,在參數上使用循環構建窗體。爲了驗證輸入參數,您需要開發一種驗證方法,輸入FormCollection,並通過Name驗證每個參數。

我認爲通過我的自定義屬性,我環路和呼籲的HtmlHelper擴展方法來呈現HTML:

0

我在下面低於最優的方式解決了這個

foreach (var attribute in group.Attributes) 
{ 
<tr> 
    <td> 
     @attribute.Name 
    </td> 
    <td> 
     @Html.ValidationMessage(attribute.Id) 
     @Html.AttributeEditor(attribute) 
    </td> 
</tr> 
} 

在AttributeEditor()方法,我設置不顯眼的JavaScript驗證屬性,以使客戶端驗證:

if (IsRequired) 
    { 
     attributes["data-val-required"] = MvcCompaniesResources.UserProfileValidatorMessages.RequiredField; 
     attributes["data-val"] = "true"; 
    } 

這使客戶端驗證,一個d適用於@Html.ValidationMessage()。不過,我仍然需要分別實現服務器端驗證。