如何将css类注入MvcHtmlString?

lev*_*nis 6 css c# asp.net-mvc-3

是否可以将css类注入已封装在一个MvcHtmlString?的HTML元素中?

我一直在负责,因为我的建筑,创造我自己的MVC扩展方法版本的表单元素(框架的一部分TextBox,TextBoxFor<>等等),有以下注意事项:

  • 他们必须创建正确的HTML标记,包括CSS类,以匹配已为网站设计的样式.在大多数情况下,这仅仅意味着增加一个特定的类.
  • 他们必须尽可能忠实于MVC扩展方法,以便开发人员能够轻松使用它们

大多数(如果不是全部)MVC扩展方法返回一个,MvcHtmlString因此模仿功能的最简单方法是直接从我的方法调用这些方法.我有自己的Html Helper,OuHelper我的框架正在使用,所以希望创建的开发人员,例如,a TextBox,会调用以下内容:

`@ Ou.TextBoxFor(m => m.Username)

我希望生成的Html像这样渲染:

<input type="text" name="Username" id="Username" class="int-text" />

如果我在MVC框架中创建自己的重载版本,我将能够控制在需要的地方添加额外的CSS类,但是对于这些方法的HTML输出的这么小的改变来说似乎有点过分.我需要提供所有重载的等效实现(TextBox单独计算泛型和非泛型版本时大约有12个).我想要做的是TagBuilder反向(从输出开始并从中创建一个可以使事情MergeAttributes变得可用的对象),但我不认为这是可能的.

要明确:我正在编写的框架代码需要自己添加css类,但是使用我创建的扩展方法的开发人员也应该可以添加自己的自定义css类.这些将根据标准MVC框架表单扩展方法的功能添加/附加

Dan*_*mms 3

您目前似乎拥有一个相当不错的系统。您无法注入/覆盖 HtmlHelper 类的默认样式,如果需要,您可以在此处查看HtmlHelper输入扩展的源代码。

我能想到的唯一其他方法是使用扩展方法,就像在实际 ASP.NET 源代码中的完成方式一样。这是一个示例,函数的名称可以是您想要的任何名称,但它需要不同,TextBoxFor因为它具有相同的参数列表。

public static class HtmlHelperExtensions
{
    public static MvcHtmlString IntTextFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return htmlHelper.TextBoxFor(expression, new { @class = "int-text" });
    }
}
Run Code Online (Sandbox Code Playgroud)

用法就像常规 MVC 一样,仅包含扩展方法的名称空间。

@using MyProject.Helpers;

@Html.IntTextFor(e => e.Age)
Run Code Online (Sandbox Code Playgroud)