属性“数据”有时会在渲染时中断

时间:2011-06-08 20:37:37

标签: json html5 asp.net-mvc-3 razor

我有一个服务器端对象。

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助手代码部分工作。

1 个答案:

答案 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));
    }
}