我有一个服务器端对象。
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帮助程序并使用Darin的HTML助手代码部分工作。
答案 0 :(得分:1)
您需要在属性中使用Html.Raw
以避免Razor执行双重HTML编码,就像这样:
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)
与以前的憎恶相比,这种看起来更好,不是吗?
这就是我所说的自定义助手:
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));
}
}