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

Den*_*gan 18 c# asp.net-mvc extension-methods html-helper

我正在尝试编写自己的小HTML帮助程序,它的行为非常类似DropDownListFor但不会遇到我之前遇到过的相同问题.我们不讨论是否DropDownListFor有缺陷 - 这不是这个问题的意义所在.

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

Bra*_*ord 24

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

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

来自MVC来源:

internal MvcHtmlString ToMvcHtmlString(TagRenderMode renderMode) {
    return MvcHtmlString.Create(ToString(renderMode));
}
Run Code Online (Sandbox Code Playgroud)

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

return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);
Run Code Online (Sandbox Code Playgroud)

return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
Run Code Online (Sandbox Code Playgroud)

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


Rup*_*Rup 8

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

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


Bri*_*per 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);
}
Run Code Online (Sandbox Code Playgroud)