2011-06-20 52 views
0

用于显示/编辑表单我使用Html.DisplayForModel()。是否有本机的ASP.NET MVC属性,可以指示标准字符串模板显示模型属性作为纯html类型的字符串类型,或者我需要创建自己的属性并更改标准字符串模板来应用此行为? 我不想粉碎Html.DisplayForModel()表达和使用Html.Raw()指示标准字符串模板显示字符串为纯HTML的属性

@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 
} 

回答

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攻击,并且您采取了足够的措施来避免它们。

+0

这对我来说是安全的解决方案,因为在将数据传递到数据库之前,我使用wiki-syntax来输入文本格式和html编码。谢谢。 –

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> 

从现在开始,您的评论将使用此模板呈现。如果你使用内置的autogenerating模板与@Html.DisplayForModel()Comment类型的属性会自动使用该模板渲染,否则,使用DisplayFor与ID,标题,dateCreated会情况

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

Html.DisplayFor返回MvcHtmlString,它不HTML编码任何更多

+0

可能是我误以为我的错误复数形式的'评论'。我的意思是评论(文本),有字符串的类型。 –