我们正试图在我们的ViewModel属性上使用[AllowHtml]装饰,以便我们可以避免使用YSOD:
从中检测到一个潜在危险的Request.Form值 客户端(RequestText =
"<br>"
)。
当我们尝试提交html文字时,例如:<br>
。我们希望在控制器操作中使用Server.HtmlEncode来防止攻击,但是当我们使用[AllowHtml]
装饰属性时它没有任何影响,如果我们尝试在控制器操作上使用[ValidateInput(false)]
,它也没有效果。我们看到StackOverflow Post说在MVC 3 RC2中你必须添加:
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();到global.asax
我们也尝试过,即使我们使用的是MVC 3的发布版本,而不是RC2,但这也没有效果。有谁知道如何解决这个问题?
型号:
namespace UI.Models.ViewModel
{
public class CustomerRequestSupport
{
/// <summary>
/// Gets or Sets the textual description entered by the Customer for
/// the support requested.
/// </summary>
[AllowHtml]
public string RequestText { get; set; }
}
}
控制器:
[HttpPost]
[TabsActionFilter]
public ActionResult RequestSupport(CustomerRequestSupport collection)
{
if (ModelState.IsValid)
{
Ticket ticket = new Ticket();
ticket.Requestor = LoggedInCustomer;
ticket.Summary = "General Support Ticket";
ticket.Notes = Server.HtmlEncode(collection.RequestText);
var errors = _ticketService.SubmitTicket(ticket);
if (errors.Any())
{
ModelState.AddModelError("collection",
String.Format("An error has occurred in your Request for Support: " +
"{0} Please try again later or call the help desk " +
"for immediate assistance.",
errors.Aggregate((acc, st) => acc + " " + st)));
}
else
{
TempData["FlashMessage"] = String.Format("Your request for support has been " +
"submitted, the Ticket Number is: {0}.", ticket.TicketNumber);
return AutoMapView<CustomerDetails>(View("Details", base.LoggedInCustomer));
}
}
//needed for tabs to show
ViewData.CustomerContactSet(base.LoggedInCustomer);
return View();
查看:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UI.Models.ViewModel.CustomerRequestSupport>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Request Support
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
Request Support
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm())
{ %>
<%= Html.ValidationSummary() %>
<h2>Enter a description of the support needed</h2>
<%: Html.TextAreaFor( m => m.RequestText, 4, 90, null) %>
<input type="submit" value="Submit" />
<% } %>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="JavaScriptContent" runat="server">
</asp:Content>
答案 0 :(得分:7)
你必须做错事。不幸的是,由于你没有展示你的例子,我们无法知道你做错了什么。让我给你写一个完整的例子:
型号:
public class MyViewModel
{
[AllowHtml]
public string RequestText { get; set; }
}
控制器:
public class HomeController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
RequestText = "<strong>Hello World</strong>";
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
查看:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.TextAreaFor(x => x.RequestText)
<button type="submit">OK</button>
}
所以你要做的不同于我在这里展示的东西。它是什么?
答案 1 :(得分:2)
在他的answer Darin肯定是在向他提出要求时。
所以你要做的不同于我在这里展示的东西。 它是什么?
我猜您在考虑FormCollection
之前,还有其他影响正在访问[AllowHtml]
的ASP.NET管道的内容。在我的脑海中,触及管道的一些常见ASP.NET MVC OSS库是ELMAH,Glimpse,WebActivator,MvcContrib,还有更多但是你得到的这个想法。
我必须相信您正在使用上述工具之一或类似的东西。假设您确保使用每个版本的最新版本并检查其开放的错误报告。
最后,快速确定您的代码,MVC实例或OSS库是否可以创建测试项目。尝试创建一个vanilla ASP.NET MVC项目。确保AllowHtml
有效。然后添加各种OSS组件,直到它中断。只需确保在OSS组件中添加版本与当前项目中使用的版本匹配的版本。