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 を使用していて、要求全体に対して行うのではなく、ビュー モデルの 1 つのプロパティに対してのみ検証を無効にしたい場合は、このビュー モデル プロパティを次の[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");
}
問題を解決しただけでなく、おわかりのように、モデル バインダーの役割である整数などを解析するコントローラー アクションに配管コードを記述する必要がなくなりました。