指示标准字符串模板将字符串显示为纯HTML的属性

时间:2011-06-20 15:16:54

标签: asp.net-mvc asp.net-mvc-3 attributes razor

对于显示/编辑表单,我使用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 个答案:

答案 0 :(得分:1)

您可以为此属性~/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攻击,并且您采取了适当的措施来避免它们。

答案 1 :(得分:0)

您可以创建评论的显示模板(将视图放置在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案例一样

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

Html.DisplayFor返回MvcHtmlString,它不再是html编码