【问题标题】:I can't make ValidateInput(False) work - A potentially dangerous Request.Form value was detected from the client我无法使 ValidateInput(False) 工作 - 从客户端检测到潜在危险的 Request.Form 值
【发布时间】:2012-08-19 14:44:44
【问题描述】:

我尝试了这么多组合,但无法在此代码块上关闭验证

[ValidateInput(false)]
    public ActionResult aSavePageCopy()
    {
        aLoggedIn();
        int id = Convert.ToInt32(Request.Form["id"]);
        PagesDataContext pdc = new PagesDataContext();
        Page p = pdc.Pages.Single(row => row.ID == id);

        p.PageCopy = Request.Form["PageCopy"];

        pdc.SubmitChanges();

        return Redirect("/Admin/aViewPages");
    }

这似乎适用于其他人,所以我看不出我在这里缺少什么。我得到的错误是从客户端检测到潜在危险的 Request.Form 值

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    您可以使用可以安全访问的FormCollection 而不是Request.Form(但请不要使用它,请参阅下面的问题的真正解决方案):

    [ValidateInput(false)]
    public ActionResult aSavePageCopy(FormCollection fc)
    {
        aLoggedIn();
        int id = Convert.ToInt32(fc["id"]);
        PagesDataContext pdc = new PagesDataContext();
        Page p = pdc.Pages.Single(row => row.ID == id);
    
        p.PageCopy = fc["PageCopy"];
    
        pdc.SubmitChanges();
    
        return Redirect("/Admin/aViewPages");
    }
    

    当然,这是解决问题的绝对荒谬和糟糕的方法。正确的做法是使用视图模型(当然):

    public class MyViewModel
    {
        public int Id { get; set; }
        public string PageCopy { get; set; }
    }
    

    然后:

    [ValidateInput(false)]
    public ActionResult aSavePageCopy(MyViewModel model)
    {
        aLoggedIn();
        PagesDataContext pdc = new PagesDataContext();
        Page p = pdc.Pages.Single(row => row.ID == model.Id);
    
        p.PageCopy = model.PageCopy;
    
        pdc.SubmitChanges();
    
        return Redirect("/Admin/aViewPages");
    }
    

    或者,如果您使用的是 ASP.NET MVC 3,并且只想对视图模型上的单个属性禁用验证,而不是对整个请求进行验证,您可以使用 [AllowHtml] 属性来装饰此视图模型属性:

    public class MyViewModel
    {
        public int Id { get; set; }
        [AllowHtml]
        public string PageCopy { get; set; }
    }
    

    然后您的操作不再需要 [ValidateInput(false)] 属性:

    public ActionResult aSavePageCopy(MyViewModel model)
    {
        aLoggedIn();
        PagesDataContext pdc = new PagesDataContext();
        Page p = pdc.Pages.Single(row => row.ID == model.Id);
    
        p.PageCopy = model.PageCopy;
    
        pdc.SubmitChanges();
    
        return Redirect("/Admin/aViewPages");
    }
    

    我们不仅解决了这个问题,而且正如您所见,您不再需要在控制器操作中编写任何管道代码来解析整数和模型绑定器所扮演的角色。

    【讨论】:

    • 一个写得很好,全面的答案,不仅解决了我的问题,还教会了我如何改进事情。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2012-03-03
    • 2013-11-15
    相关资源
    最近更新 更多