AllowHtml不适用于ASP.Net Mvc 3站点

Rus*_*ark 5 asp.net-mvc html-encode

我们尝试在我们的ViewModel属性上使用[AllowHtml]修饰,以便我们可以避免使用YSOD:

从客户端检测到潜在危险的Request.Form值(RequestText = "<br>").

当我们尝试提交html文本时,如:<br>.我们希望在控制器动作中使用Server.HtmlEncode来防止攻击,但是当我们用[AllowHtml]它来装饰属性没有任何影响时,如果我们尝试使用[ValidateInput(false)]控制器动作,它也没有任何效果.我们看到一个StackOverflow帖子说在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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

    [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();
Run Code Online (Sandbox Code Playgroud)

视图:

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 7

你得做错事.不幸的是,由于你没有展示你的例子,我们无法知道你做错了什么.那么让我给你写一个完整的例子:

模型:

public class MyViewModel
{
    [AllowHtml]
    public string RequestText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.TextAreaFor(x => x.RequestText)
    <button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)

所以你要做的不同于我在这里展示的东西.它是什么?


ahs*_*ele 2

在达林的回答中,当他询问时,他肯定是在做某事

所以你必须做一些与我在这里展示的不同的事情。它是什么?

我猜测您还有其他因素影响了在考虑FormCollection您之前访问 ASP.NET 管道。[AllowHtml]在我的脑海中,一些常见的涉及管道的 ASP.NET MVC OSS 库是ELMAHGlimpseWebActivatorMvcContrib,还有更多,但你明白了。

我必须相信您正在使用上述工具之一或类似的工具。假设您确保您使用的是每个版本的最新版本并检查他们的开放错误报告。

最后,确定它是您的代码、MVC 实例还是 OSS 库的快速方法是创建一个测试项目。尝试创建一个普通的 ASP.NET MVC 项目。确保AllowHtml有效。然后添加各种 OSS 组件,直到损坏为止。只要确保添加 OSS 组件时版本与您当前项目中使用的版本相匹配即可。