为什么不能通过HtmlHelper呈现所有表单控件?

时间:2009-04-22 06:45:54

标签: asp.net-mvc design-principles

有人知道为什么可以使用System.Web.Mvc.HtmlHelper(隐藏,复选框,密码,文本框)呈现某些HTML表单控件,而有些则不能也应该用HTML(文件,提交)显式编写?这种分离的原理是什么?

2 个答案:

答案 0 :(得分:4)

好问题。

我认为输入控件(例如input,select)包含在Html助手中,因此他们可以通过TempData维护自己的状态,而无需用户编写大量代码来实现这一点。我还认为链接和表单控件被包装,以便为这些控件指定控制器/操作提供简单统一的方法。大多数其他控件不保证开箱即用的状态管理或需要构建控制器/操作URL。

当然没有什么可以阻止你为自己喜欢的任何控件编写自己的包装器 - 例如这是我使用的一对 - 这是一个html标签控件:

public static string Label(this HtmlHelper helper, string fieldName, string labelText)
{
    var sb = new StringBuilder();
    sb.Append("<label for=\"");
    sb.Append(fieldName);
    sb.Append("\">");
    sb.Append(labelText);
    sb.Append("</label>");
    return sb.ToString();
}

这是我使用的那个包装标签帮助器和文本框以生成带有标签的统一文本输入字段:

public static string TextField(this HtmlHelper helper, string labelText, string fieldName, string value)
{
    return string.Concat(
        "<div>",
        helper.Label(fieldName, labelText),
        helper.TextBox(fieldName, value),
        "</div>");
}

答案 1 :(得分:3)

我在帖子"Html.SubmitButton() missing in Preview4?"中找到了Phil Haack关于这个问题的答案:

  是的,我们正努力保持   帮助者有点极简主义。不只   那,我们收到了来自的反馈   有些人说我们很多帮手   是不必要的。 “我知道HTML,为什么呢   我需要一个SubmitButton助手吗?“。

     

我们认为自输入按钮   通常不用于呈现用户   输入,辅助方法有边际   值。毕竟,使用VS HTML   编辑,你得到intellisense   类型。它告诉你   哪些属性可用。我们的   帮手没有。

     

...

     

我们要避免的是拥有一个   每个html元素的帮助器。那   没有意义:Html.Div。

     

我们想要一个设计   帮助者的理由。也许我们有   一个用于所有常见的表单元素,   不只是那些显示用户的人   输入。这是一种可能性   我们将包括SubmitButton。

     

目前,我们的理由是任何共同点   表单帮助器,用于呈现用户输入,   或任何渲染路由的助手   信息,有一个帮助...