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