Как отобразить HtmlAttributes со значениями объекта, используя ASP.NET MVC 3 Razor? - PullRequest
5 голосов
/ 16 ноября 2011

Я пытаюсь отобразить следующий HTML-код, используя MVC3 Razor View:

<input id="EffectiveDate" name="EffectiveDate" type="date" data-options='{"mode": "flipbox"}' />

Мне не удалось получить кавычки в атрибуте data-options для рендеринга. Независимо от того, что я пытаюсь, они отображаются как &quot;

Вот несколько подходов, которые я попробовал в своем View:

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

Любые предложения о том, как декодировать кавычки?

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

Вы можете сделать это, создав шаблон MVC Editor. Сначала создайте папку с именем «EditorTemplates» внутри папки «Views \ Shared». Затем поместите файл с именем DateTime.cshtml в папку EditorTemplates.

Затем вы можете просто использовать метод EditorFor () для свойства вашей модели представления следующим образом (при условии, что свойство EffectiveDate типа DateTime):

@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"}' />

Это даст точный результат, который вы ищете.

1 голос
/ 16 ноября 2011

Одно можно сказать наверняка: специальные символы всегда будут кодироваться при использовании любого из входных расширений 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. Вот хороший маленький трюк JQuery, который сделает это:

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

Возможно, вы захотите сделать для этого функцию.

Источники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...