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

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");
}

問題を解決しただけでなく、おわかりのように、モデル バインダーの役割である整数などを解析するコントローラー アクションに配管コードを記述する必要がなくなりました。

于 2012-08-19T14:51:17.127 に答える