2011-06-16 135 views
0

剛剛開始瞭解MVC3的竅門,並希望開始構建一些自定義控件,我可以將它們放入視圖中。具體而言,我希望能夠放入一些html窗體控件,它們會自動添加一些javascript用於驗證。創建自定義控件mvc3

這樣的事情是我想要的東西:

@Html.VTextBox("MyTextBox","",new {@vType="PhoneNumber", @vMessage="You Must Enter a Phone Number" }) 

當頁面呈現,我希望它搜索任何自定義元素創建,然後在適當的JavaScript來驗證客戶端下降。我也非常相似,這與asp.net web表單自定義一些控制,即

<ucc:VTextBox ID="MyTextBox" runat="server" message="You must fill this in" /> 

只是想知道如果MVC3提供相同的可擴展性。任何資源或建議,你可以提供將不勝感激。

TIA

回答

1

剛開始時,你需要考慮擴展方法,更具體地說,如何創建HtmlHelper類的擴展方法,所以你可以寫像你上面所顯示的示例代碼。

對於您在上面的例子中,你可以寫這樣的代碼:

public MvcHtmlString VTextBox(string name, object value, object htmlAttributes) 
{ 
    StringBuilder html = new StringBuilder(); 

    // Build your html however you want 
    // Here's a simple example that doesn't 
    // take into account your validation needs 
    html.AppendFormat("input type=\"text\" name=\"{0}\" value=\"{1}\" />", name, value); 

    return MvcHtmlString(html.ToString()); 
} 

然後在您的視圖中,可以使用上面,像這樣的例子:

@Html.VTextBox("MyTextBox","",new {@vType="PhoneNumber", @vMessage="You Must Enter a Phone Number" }) 

注意:需要將擴展​​方法所在的名稱空間導入到您的視圖中。最簡單的方法是,將@using ExtensionMethodNamespace放在視圖頂部。通過擺弄web.config(也可能是Global.asax),可以使名稱空間自動導入所有視圖。

附錄:請注意下面的RPM1984的評論,他建議使用TagBuilder代替StringBuilder,這是合理的建議,因爲這是TagBuilder專門設計的確切場景。他還提到了強大的模型幫手,這也是很好的建議。

+0

兩點。 1)你應該使用'TagBuilder',它更豐富,更適合html擴展。 2)在可能的情況下,您應該強制幫助模型,以避免傳遞其他參數。所以它可能是'VTextBox (object htmlAttributes)',你可以從'htmlHelper.ViewData.Model'中取出你需要的東西。但總的來說,很好的答案+1 – RPM1984 2011-06-16 05:42:25