7

是否可以将 css 类注入到已封装在MvcHtmlString.

作为我正在构建的框架的一部分,我的任务是为表单元素(、、等)创建我自己的 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 框架表单扩展方法的功能添加/附加

4

2 回答 2

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" });
    }
}

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

@using MyProject.Helpers;

@Html.IntTextFor(e => e.Age)
于 2013-04-05T15:01:11.323 回答
0

你可以这样做

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

或用于内联样式

@Ou.TextBoxFor(m => m.Username,new{@style="font-size:10px"})
于 2013-04-05T10:47:24.383 回答