如何使用ASP.NET MVC 3 Razor使用对象值呈现HtmlAttributes?

时间:2011-11-16 00:31:33

标签: asp.net-mvc asp.net-mvc-3 jquery-mobile

我正在尝试使用MVC3 Razor View呈现以下HTML:

<input id="EffectiveDate" name="EffectiveDate" type="date" data-options='{"mode": "flipbox"}' />

我无法在data-options属性中获取引号来呈现。无论我尝试什么,它们都会呈现为&quot;

以下是我在视图中尝试的几种方法:

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= " { 'mode':'flipbox' }"})

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= @Html.Raw("{\"mode\":\"flipbox\"}")})

有关如何解码引号的任何建议吗?

2 个答案:

答案 0 :(得分:4)

您可以通过创建MVC编辑器模板来完成此操作。首先,在“Views \ Shared”文件夹中创建一个名为“EditorTemplates”的文件夹。然后在EditorTemplates文件夹中放入一个名为DateTime.cshtml的文件。

然后你可以简单地对你的视图模型的属性使用EditorFor()方法(前提是DateTime类型的EffectiveDate属性):

@Html.EditorFor(m => m.EffectiveDate)

DateTime.cshtml编辑器模板的完整代码如下所示:

@model System.DateTime
@{
    var id = this.ViewData.TemplateInfo.GetFullHtmlFieldId("");
    var name = this.ViewData.TemplateInfo.GetFullHtmlFieldName("");
}
<input id="@id" name="@name" type="date" data-options='{"mode": "flipbox"}' />

这将产生您正在寻找的确切输出。

答案 1 :(得分:1)

有一点是肯定的:当您使用任何默认的MVC输入扩展(即TextBoxFor)时,将始终对特殊符号进行编码。这是因为TagBuilder本身用于为HtmlHelper扩展构建标记,HtmlEncode是标记中的每个属性值。您可以在TagBuilder源代码中看到这一点:

private void AppendAttributes(StringBuilder sb)
{
    foreach (var attribute in Attributes)
    {
        string key = attribute.Key;
        if (String.Equals(key, "id", StringComparison.Ordinal /* case-sensitive */) && String.IsNullOrEmpty(attribute.Value))
        {
            continue; // DevDiv Bugs #227595: don't output empty IDs 
        }
        string value = HttpUtility.HtmlAttributeEncode(attribute.Value);
        sb.Append(' ')
            .Append(key)
            .Append("=\"")
            .Append(value)
            .Append('"');
    }
} 

由于您无法发送已解码的值,因此您必须自己在JavaScript中对其进行解码。这是一个很好的小jQuery技巧:

var value = $('<textarea/>').html(yourElement.data('options')).val();

当然,您可能想要为此制作一个功能。

来源: