Атрибут, который указывает стандартному шаблону строки отображать строку в виде обычного HTML - PullRequest
0 голосов
/ 20 июня 2011

Для отображения / редактирования форм я использую Html.DisplayForModel(). Существует ли собственный атрибут ASP.NET MVC, который может указать шаблону стандартной строки отображать свойство модели с типом строки в виде обычного HTML, или мне нужно создать собственный атрибут и изменить шаблон стандартной строки, чтобы применить это поведение? Я не хочу подавлять Html.DisplayForModel() выражение и использовать Html.Raw():

@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Title)
@Html.DisplayFor(m => m.DateCreated)
@Html.Raw(Model.Comment)

public class MyModel
{
public int Id {get;set;}
public string Title {get;set;}
public DateTime DateCreated {get;set;}
public string Comment {get;set;} // contains plain html
}

Ответы [ 2 ]

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

Вы можете определить специальный шаблон отображения для этого свойства ~/Views/Shared/DisplayTemplates/Unencoded.cshtml:

@model string
@Html.Raw(Model)

, а затем в вашей модели представления использовать атрибут [UIHint]:

public class MyModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }

    [UIHint("Unencoded")]
    public string Comment { get; set; } // contains plain html
}

Теперь ваш основной вид может выглядеть просто так:

@model MyModel
@Html.DisplayForModel()

С помощью помощника Html.Raw вы подтверждаете, что полностью осознаете последствия этого и что ваш сайт становится уязвимым для атак XSS ичто вы предпринимаете адекватные действия, чтобы избежать их.

0 голосов
/ 20 июня 2011

Вы можете создать шаблон отображения комментариев (поместить представление в папку DisplayTemplates)

// пример comments.cshtml

@model MyApplicationNamespace.ViewModels.Comments

<ul>

@if (Model != null)
{
   for (int i =0; i<Model.Count(); i++ )
       {
           <li>Model.UserName + ":" + Model.CommentText </li>
       }
}

</ul>

И теперь ваш комментарий будет отображаться с этим шаблоном. Если вы используете встроенные автоматически созданные шаблоны с @Html.DisplayForModel(), свойства типа Comment будут автоматически отображаться с этим шаблоном, в противном случае используйте DisplayFor как с id, title, dateCreated case

@Html.DisplayFor(m => m.Comments)

Html.Display для возврата MvcHtmlString, и он больше не кодируется в формате html

...