HtmlHelper 渲染 htmlAttributes 对象的方法是什么?
What is HtmlHelper's method to render htmlAttributes object?
我正在构建一个编辑器模板,它将接受 htmlAttributes
对象。
例子很简单。
在主视图中我有类似
的内容
@Html.EditorFor(Function(x) x.SomeProperty, New With {.htmlAttributes = New With {.class = "form-control"}}).
并且在编辑器模板中我需要写入 class="form-control"
属性。
如果我在模板中使用 @Html.TextBoxFor(Function(x) x, ViewData("htmlAttributes"))
之类的东西,那么一切正常。但是如果我手动构建标签,我无法输出htmlAttributes
,即我构建<input type="text" {htmlAttributes should be here} />
是否有任何 public 方法可以正确呈现标记内的 HTML 属性?
我不确定您要在这里寻找什么。传统上,编辑器模板只会传递 htmlAttributes。例如:
查看
@Html.EditorFor(m => m.FooString, new { htmlAttributes = new { @class = "foo" } })
String.cshtml
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), ViewData["htmlAttributes"])
如果您询问如何设置默认值,然后可以通过传递 htmlAttributes
来覆盖或添加默认值。然后,你在那里几乎是一个人。 MVC 中没有任何东西可以帮助您(至少完全)。但是,我确实编写了自己的 HtmlHelper 扩展来处理这个问题。我实际上写了一个 blog post 来解释它的作用以及如何使用它。我建议您检查一下,但为了完整性,我会 post 此处的代码。
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
public static partial class HtmlHelperExtensions
{
public static IDictionary<string, object> MergeHtmlAttributes(this HtmlHelper helper, object htmlAttributesObject, object defaultHtmlAttributesObject)
{
var concatKeys = new string[] { "class" };
var htmlAttributesDict = htmlAttributesObject as IDictionary<string, object>;
var defaultHtmlAttributesDict = defaultHtmlAttributesObject as IDictionary<string, object>;
RouteValueDictionary htmlAttributes = (htmlAttributesDict != null)
? new RouteValueDictionary(htmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesObject);
RouteValueDictionary defaultHtmlAttributes = (defaultHtmlAttributesDict != null)
? new RouteValueDictionary(defaultHtmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(defaultHtmlAttributesObject);
foreach (var item in htmlAttributes)
{
if (concatKeys.Contains(item.Key))
{
defaultHtmlAttributes[item.Key] = (defaultHtmlAttributes[item.Key] != null)
? string.Format("{0} {1}", defaultHtmlAttributes[item.Key], item.Value)
: item.Value;
}
else
{
defaultHtmlAttributes[item.Key] = item.Value;
}
}
return defaultHtmlAttributes;
}
}
然后,在您的编辑器模板中(本例中为Date.cshtml
):
@{
var defaultHtmlAttributesObject = new { type = "date", @class = "form-control" };
var htmlAttributesObject = ViewData["htmlAttributes"] ?? new { };
var htmlAttributes = Html.MergeHtmlAttributes(htmlAttributesObject, defaultHtmlAttributesObject);
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), htmlAttributes)
更新
I cannot use @Html.TextBox, but need to write manually <input type="text" {htmlAttributes should be here} />
为什么? 帮助程序版本几乎无所不能。但是,如果您坚持走那条路,那么使用 Razor 将很难做到这一点。假设您实际上可以在没有 Razor 语法错误的情况下编写它,那么代码将几乎不可读。我建议在纯 C# 中使用 TagBuilder
and/or StringBuilder
来构造一个字符串,然后确保 return/set 类型为 MvcHtmlString
的变量:
var output = new MvcHtmlString(builder.ToString());
但是,如果您要走那么远,就会否定使用编辑器模板的目的,除非您试图覆盖其中一个默认编辑器模板。无论如何,我建议只创建您自己的 HtmlHelper 扩展,然后直接在您的视图中使用它或在您的编辑器模板中使用它。
那么对于您的情况,您可以使用静态方法来帮助您将 htmlAttributes
序列化为您需要的 string
。我认为这就是您所需要的:
public static string StringlifyHtmlAttributes(object htmlAttributes)
{
string stringHtmlAttributes = String.Empty;
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes))
{
stringHtmlAttributes += string.Format("{0}=\"{1}\" ", property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
}
return stringHtmlAttributes;
}
我正在构建一个编辑器模板,它将接受 htmlAttributes
对象。
例子很简单。
在主视图中我有类似
的内容@Html.EditorFor(Function(x) x.SomeProperty, New With {.htmlAttributes = New With {.class = "form-control"}}).
并且在编辑器模板中我需要写入 class="form-control"
属性。
如果我在模板中使用 @Html.TextBoxFor(Function(x) x, ViewData("htmlAttributes"))
之类的东西,那么一切正常。但是如果我手动构建标签,我无法输出htmlAttributes
,即我构建<input type="text" {htmlAttributes should be here} />
是否有任何 public 方法可以正确呈现标记内的 HTML 属性?
我不确定您要在这里寻找什么。传统上,编辑器模板只会传递 htmlAttributes。例如:
查看
@Html.EditorFor(m => m.FooString, new { htmlAttributes = new { @class = "foo" } })
String.cshtml
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), ViewData["htmlAttributes"])
如果您询问如何设置默认值,然后可以通过传递 htmlAttributes
来覆盖或添加默认值。然后,你在那里几乎是一个人。 MVC 中没有任何东西可以帮助您(至少完全)。但是,我确实编写了自己的 HtmlHelper 扩展来处理这个问题。我实际上写了一个 blog post 来解释它的作用以及如何使用它。我建议您检查一下,但为了完整性,我会 post 此处的代码。
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
public static partial class HtmlHelperExtensions
{
public static IDictionary<string, object> MergeHtmlAttributes(this HtmlHelper helper, object htmlAttributesObject, object defaultHtmlAttributesObject)
{
var concatKeys = new string[] { "class" };
var htmlAttributesDict = htmlAttributesObject as IDictionary<string, object>;
var defaultHtmlAttributesDict = defaultHtmlAttributesObject as IDictionary<string, object>;
RouteValueDictionary htmlAttributes = (htmlAttributesDict != null)
? new RouteValueDictionary(htmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesObject);
RouteValueDictionary defaultHtmlAttributes = (defaultHtmlAttributesDict != null)
? new RouteValueDictionary(defaultHtmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(defaultHtmlAttributesObject);
foreach (var item in htmlAttributes)
{
if (concatKeys.Contains(item.Key))
{
defaultHtmlAttributes[item.Key] = (defaultHtmlAttributes[item.Key] != null)
? string.Format("{0} {1}", defaultHtmlAttributes[item.Key], item.Value)
: item.Value;
}
else
{
defaultHtmlAttributes[item.Key] = item.Value;
}
}
return defaultHtmlAttributes;
}
}
然后,在您的编辑器模板中(本例中为Date.cshtml
):
@{
var defaultHtmlAttributesObject = new { type = "date", @class = "form-control" };
var htmlAttributesObject = ViewData["htmlAttributes"] ?? new { };
var htmlAttributes = Html.MergeHtmlAttributes(htmlAttributesObject, defaultHtmlAttributesObject);
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), htmlAttributes)
更新
I cannot use @Html.TextBox, but need to write manually
<input type="text" {htmlAttributes should be here} />
为什么? 帮助程序版本几乎无所不能。但是,如果您坚持走那条路,那么使用 Razor 将很难做到这一点。假设您实际上可以在没有 Razor 语法错误的情况下编写它,那么代码将几乎不可读。我建议在纯 C# 中使用 TagBuilder
and/or StringBuilder
来构造一个字符串,然后确保 return/set 类型为 MvcHtmlString
的变量:
var output = new MvcHtmlString(builder.ToString());
但是,如果您要走那么远,就会否定使用编辑器模板的目的,除非您试图覆盖其中一个默认编辑器模板。无论如何,我建议只创建您自己的 HtmlHelper 扩展,然后直接在您的视图中使用它或在您的编辑器模板中使用它。
那么对于您的情况,您可以使用静态方法来帮助您将 htmlAttributes
序列化为您需要的 string
。我认为这就是您所需要的:
public static string StringlifyHtmlAttributes(object htmlAttributes)
{
string stringHtmlAttributes = String.Empty;
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes))
{
stringHtmlAttributes += string.Format("{0}=\"{1}\" ", property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
}
return stringHtmlAttributes;
}