2011-11-16 13 views
5

ASP.NET MVC 3 Razorを使用してHtmlAttributesをオブジェクト値でレンダリングするには?

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

引用符をデコードしますか?

+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

私はすでにこのフィールドにエディタテンプレートを使用しています(この問題とは無関係の理由から)。このアプローチは私にとってはうまくいくでしょう。ありがとう!なぜMVCの入力拡張が常に属性をエンコードするのかを説明する@rdumontに感謝します。 – xcer

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でそれを自分でデコードする必要があります。

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

これはもちろん、そのための機能を作りたいと思うかもしれません。

出典:

関連する問題