4

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

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

4

1 回答 1

7

您可以使用FormCollectionwhich is safe to access 而不是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");
}

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

于 2012-08-19T14:51:17.127 回答