我正在尝试使用MVC3 Razor View呈现以下HTML:
<input id="EffectiveDate" name="EffectiveDate" type="date" data-options='{"mode": "flipbox"}' />
我无法在data-options属性中获取引号来呈现。无论我尝试什么,它们都会呈现为"
以下是我在视图中尝试的几种方法:
@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\"}")})
有关如何解码引号的任何建议吗?
答案 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();
当然,您可能想要为此制作一个功能。
来源: