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

Kar*_*ies 4 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");
    }
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 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");
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyViewModel
{
    public int Id { get; set; }
    public string PageCopy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

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

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

然后你不再需要[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");
}
Run Code Online (Sandbox Code Playgroud)

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