2011-06-08 11 views
0

私はサーバーサイドオブジェクトを持っています。私の見解の内部属性 'data'がレンダリング時に破損することがあります

public class OptionRelation 
{ 
    public intOptionId { get; set; } 
    public string Type { get; set; } 
    public string Child { get; set; } 
    public string Peer { get; set; } 
} 

、私は次の操作を行います。

//where relations is a List<OptionRelation> 
var a = relations.FindAll(r => r.OptionId == option.OptionID); 
string data_relation = ""; 
if(a.Count > 0) 
{ 
    data_relation = "data-relation=" + Json.Encode(a); 
} 

<input type="checkbox" @data_relation /> 

は@dataは、私はほとんどの時間を期待する道を埋めます属性。しかし、時にはそれが壊れます。私がFireBugで開くと、<input>の属性はすべてゴミです。私が考えることができるのは、データ・リレーションの長さが壊れたときに、残りのケースがやや長くなるということだけです。特に、データ関係が次のようになったときに破損します。

data-relation="[{"OptionId":80,"Type":"required_1","Child":"#1625, #1626, #1627","Peer":""}]" 

これが壊れている理由は何ですか?解決策:大量のコードを書き直し、最終的にカスタムHTMLヘルパーを使用し、ダーリンのコードをHTMLヘルパーに部分的に利用するようにしました。あなたはちょうどこのように、二重のHTMLエンコードを実行カミソリを避けるために、属性にHtml.Rawを使用する必要が

答えて

1

var a = relations.FindAll(r => r.OptionId == option.OptionID); 
string data_relation = ""; 
if(a.Count > 0) 
{ 
    data_relation = string.Format(
     "data-relation=\"{0}\"", 
     Html.AttributeEncode(Json.Encode(a)) 
    ); 
} 

<input type="checkbox" @Html.Raw(data_relation) /> 

これは言われているが、ビューにそんなにC#のコードを書くことは、おそらく最悪のものの一つでありますあなたはASP.NET MVCアプリケーションで行うことができます。それは見て維持することは恐ろしいです。これは、ビューがするべきことではありません。これは、カスタムHTMLヘルパーが役に立ちそうなものです。あなたは、単に種類のそれは、以前の醜態に比べて良くはありません見えること、次の

@Html.MyCheckBox(option.OptionID) 

を書くことができたときに、なぜあなたの意見をspaghettifying?

そして、ここでは、私はカスタムヘルパーによって何を意味するかです:

public static class CheckBoxExtensions 
{ 
    public static MvcHtmlString MyCheckBox(
     this HtmlHelper<IEnumerable<OptionRelation>> htmlHelper, 
     int optionId 
    ) 
    { 
     var checkbox = new TagBuilder("input"); 
     checkbox.Attributes["type"] = "checkbox"; 
     var model = htmlHelper.ViewData.Model; 
     var a = model.Where(x => x.OptionId == optionId); 
     if (a.Count() > 0) 
     { 
      var json = new JavaScriptSerializer().Serialize(a); 
      checkbox.Attributes["data-relation"] = json; 
     } 
     return MvcHtmlString.Create(checkbox.ToString(TagRenderMode.SelfClosing)); 
    } 
} 
+0

Html.AttributeEncodeラインがnull参照の例外がスローされます。 – Dimskiy

+0

私は実際には@helperでApp_Codeフォルダに持っていますが、それについて言及していません。しかし指摘してくれてありがとう! – Dimskiy

+0

この行はまだクラッシュしています:Html.AttributeEncode(Json.Encode(a))オブジェクトがnullです – Dimskiy

関連する問題