2

MVC3 への投稿後に不要な解析/更新からモデルを保護するためのベスト プラクティスは何ですか?

HttpGet-> Product/Edit で呼び出されるコントローラ アクション:

 public ActionResult Edit()
        {
          Product p = new Product();
          p.Id = 1;
          p.Name = "PC";
          Category cat = new Category();
          cat.Id = 1;
          cat.Name = "Non food";
          p.Category = cat;

          return View(p);
        }

これは編集ビューです。

@model MvcApplication3.Models.Product
@using (Html.BeginForm("Edit", "Product", FormMethod.Post))
{
  @Html.HiddenFor(model => model.Id)
  @Html.EditorFor(model => model.Name)
  <input type="submit" value="Submit" name="go" />
}

ブラウザーが応答を受け取った後、ユーザーは次の html セグメントをページに挿入します。

<input type="text" value="5" name="Category.Id" id="Category_Id"/>

彼はフォームを投稿し、次のコントローラー アクションは "Product" パラメーターを取得します。

    //
    // POST: /Class1/Edit/5

    [HttpPost]
    public ActionResult Edit(Product p)
    {
      //Here: p.Company.Id is 5    !!!
      db.Save(p);
      return null;
    }

問題は、ユーザーが c.Company.Id を投稿/更新することを許可してはならないことです。不要な値を探しているパラメーター構造全体をチェックしたくありません。問題を解決するためのベストプラクティスを探しています。

どんな助けでも大歓迎です!

ベスト、

愚かな

4

2 に答える 2

1

そのため、ビューで db エンティティではなくビュー モデルを使用する必要があります。

http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

于 2012-03-07T11:47:51.103 に答える
1

Josh Bush による最近のブログ投稿で説明されているように、受信したエンティティ タイプ (つまり、ViewModel) をデータベースに永続化されたエンティティ タイプから分離できます。一読の価値あり - GitHub が経験した最近の同様の問題に起因するため、話題にもなります。

例えば

public ActionResult Edit(ProductModel p)
{
    // Map ProductModel -> a Product instance
    // Then save
}
于 2012-03-07T11:42:34.280 に答える