我无法使ValidateInput(False)工作 - 从客户端检测到一个潜在危险的Request.Form值

时间:2012-08-19 14:44:45

标签: c# asp.net-mvc razor

我已经尝试过这么多组合,但是无法在此代码块中关闭验证

[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值

1 个答案:

答案 0 :(得分:7)

您可以使用可以安全访问的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");
}

不仅我们已经解决了问题,而且你可以看到你不再需要在你的控制器动作中编写任何管道代码来解析整数和东西,这是模型绑定器的作用。