2011-11-16 52 views
5

我试图渲染使用MVC3 Razor视图下面的HTML:如何使用ASP.NET MVC 3 Razor使用对象值呈现HtmlAttributes?

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

我一直无法得到的数据选项的引号属性来呈现。不管我怎么努力,他们都呈现为&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\"}")}) 

任何建议,就如何解码引号?

+0

你在那个领域做什么?如果您使用的是jQuery,您可能需要将其作为html字符串读取,然后在使用jquery进行解码之前进行解码。 – jzm

+0

我正在使用jQuery Mobile插件将文本框变成日期选择器。 'data-options'属性定义日期选择器选项。 jQuery根据你所说的解码数据选项对象,所以一切工作正常。但我想知道如何在渲染之前解码引号,以清理我的代码并供将来参考。这似乎是我可能在某个时候再次遇到的事情。 – xcer

回答

4

您可以通过创建一个MVC编辑模板做到这一点。首先,在“Views \ Shared”文件夹中创建一个名为“EditorTemplates”的文件夹。然后在EditorTemplates文件夹中放入一个名为DateTime.cshtml的文件。

然后,你可以简单地使用EditorFor()方法对您的视图模型的财产像这样(提供该类型的日期时间的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"}' /> 

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

+0

我已经在使用此字段的编辑器模板(与此问题无关的原因),所以这种方法对我来说很好。谢谢!并感谢@rdumont解释为什么MVC输入扩展将始终编码属性。 – xcer

1

有一点是肯定的:当您使用任何默认MVC输入扩展名(即TextBoxFor)时,特殊符号将始终被编码。这是因为TagBuilder本身用于为标签中的HtmlHelper扩展标记构建标签中的每个属性值。您可以在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(); 

当然,你可能想做一个函数。

来源:

相关问题