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