如何将css类注入MvcHtmlString?

时间:2013-04-05 10:39:19

标签: c# css asp.net-mvc-3

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

作为我正在构建的框架的一部分,我的任务是为表单元素(TextBoxTextBoxFor<>等)创建自己的MVC扩展方法版本,以下警告:

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

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

  

`@Ou.TextBoxFor(m =&gt; m.Username)

我希望生成的Html像这样呈现:

  

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

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

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

添加/附加

2 个答案:

答案 0 :(得分:3)

你现在似乎有一个非常好的系统。您不能注入/覆盖HtmlHelper类的默认样式,如果需要,可以查看HtmlHelper's input extensions here的源代码。

我能想到的另一种方法是使用扩展方法,就像在实际的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" });
    }
}

用法就像常规MVC一样只包含扩展方法的命名空间。

@using MyProject.Helpers;

@Html.IntTextFor(e => e.Age)

答案 1 :(得分:0)

你可以这样做

@Ou.TextBoxFor(m => m.Username,new{@Class="your class Name"})

或  内联样式

@Ou.TextBoxFor(m => m.Username,new{@style="font-size:10px"})