Атрибут «данные» иногда ломается при рендеринге - PullRequest
0 голосов
/ 09 июня 2011

У меня есть объект на стороне сервера.

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.

1 Ответ

1 голос
/ 09 июня 2011

Вам нужно использовать 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...