ASP.NET MVC:为什么`ToMvcHtmlString`不公开?

时间:2010-07-28 12:53:00

标签: c# asp.net-mvc extension-methods html-helper

我正在尝试编写自己的小HTML帮助程序,其作用与DropDownListFor非常相似,但不会遇到我以前遇到过的problems。我们不讨论DropDownListFor是否有缺陷 - 这不是这个问题的关键。

无论如何,MVC人员ToMvcHtmlString内部而非公开的原因是什么?

3 个答案:

答案 0 :(得分:23)

我认为我会为那些可能正在寻找一个并且偶然发现这个问题的人发布一个简单的解决方法。

虽然ToMvcHtmlString是内部的,但它很容易绕过,因为它使用公共方法:

来自MVC来源:

internal MvcHtmlString ToMvcHtmlString(TagRenderMode renderMode) {
    return MvcHtmlString.Create(ToString(renderMode));
}

MvcHtmlString.Create和TagBuilder.ToString都是公开的,所以只需替换

return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);

return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));

你很高兴去!对我来说很棒。不知道为什么他们甚至不愿意制作一个单独的内部方法。

答案 1 :(得分:8)

我的猜测是鼓励您使用System.Web.HtmlString代替。但是,是的,我自己也想知道这一点,并且我在自己的助手中写了一个重复的ToMvcHtmlString扩展名。

MvcHtmlString,IIRC,只是他们的兼容性修复,所以MVC 2可以在.NET 3.5和4上运行 - 但即便如此,在你自己的代码中使用它也是有用的。

答案 2 :(得分:5)

这会解决您的问题吗?

public static MvcHtmlString SuperDenizControl(this HtmlHelper html)
{
    var builder = new TagBuilder("select");
    //blah blah blah amazing control
    var control = builder.ToString();
    return MvcHtmlString.Create(control);
}