您可以使用可以安全访问的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");
}
我们不仅解决了这个问题,而且正如您所见,您不再需要在控制器操作中编写任何管道代码来解析整数和模型绑定器所扮演的角色。