2011-06-16 138 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