Html.Raw дает ошибку - PullRequest
       2

Html.Raw дает ошибку

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

Я получаю следующую ошибку:

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

Когда я пытаюсь использовать:

 @Html.DisplayFor(modelItem =>  Html.Raw(item.ChangesMade))

в моем asp.net MVC 3 view.

Можете ли вы предложить правильный синтаксис?

Ответы [ 5 ]

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

ОБНОВЛЕНО Вы не можете использовать вспомогательный шаблон HTML.DisplayFor с HtmlString, подобным тому, который возвращается из Html.Raw.

Вместо этого, предполагая, что ваш item.ChangesMade содержит необработанный HTML, который полезен, попробуйте просто

@Html.Raw(modelItem => modelItem.ChangesMade)

ИЛИ (более вероятно), если ChangesMade - просто значение, тогда используйте помощник Html:

@Html.TextBox("NameOfTextbox", modelItem.ChangesMade)

Самый простой способ для простых свойств - использовать помощников по шаблонам (EditorFor, TextboxFor и т. Д.), Потому что они будут использовать любые атрибуты DataAnnotation, которые вы использовали в ваших классах модели - особенно это важно при встроенной проверке!

Например:

public class MyModelClass
{
    [Required("The name field is required")]
    public virtual string Name { get; set; }
}

Таким образом, вы можете использовать помощника по шаблонам, если item.ChangesMade - простой тип и может быть выражен (Textbox, Checkbox, Textarea и т. Д.).

@Html.EditorFor(modelItem => modelItem.ChangesMade);

Вы также можете использовать в сочетании со встроенной проверкой:

@Html.EditorFor(modelItem => modelItem.ChangesMade)
@Html.ValidationMessageFor(modelItem => modelItem.ChangesMade)

Надеюсь, это поможет!

0 голосов
/ 25 сентября 2018

Вы можете просто опустить DisplayFor и modelItem => , поэтому:

@Html.Raw(item.ChangesMade)
0 голосов
/ 05 мая 2012

Мне было интересно то же самое.Я предполагаю, что вы использовали конструктор представлений внутри Visual Studio для создания своего представления и в итоге получили что-то вроде:

.
.
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.field1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.field2)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.field3)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>
    </tr>
}
.
.

Поработав с ним немного, я просто закончил замену:

 @Html.DisplayFor(modelItem => item.field1)

с:

 @Html.Raw(item.field1)

И он выдает желаемый результат для меня - поле в кодировке HTML

Конечно, вы также хотите принять меры безопасности против людей, бросающих теги сценарияи тому подобное.

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

Почему вы используете Html.Raw там? Просто напишите так

@Html.DisplayFor(modelItem =>  item.ChangesMade)
0 голосов
/ 16 ноября 2011

Я предлагаю вам создать шаблон отображения, используя простую строку в качестве модели

Что-то вроде:

@model string
@{
 <span>@Html.Raw(Model)</span>
}

Назовите его DisplayMyHtmlString и поместите его в Views / Shared / DisplayTemplates

По вашему мнению, просто используйте помощник EditorFor:

@Html.DisplayFor(m => m.ChangesMade, "DisplayMyHtmlString", "Name")

Это должно работать, я использую аналогичный шаблон для EditFor.

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