8

ビューにバインドしているViewModelがあります:

ProductViewModel model = Mapper.Map<Product, ProductViewModel>(product);
return View(model);

ビュー (およびビューモデル) は編集に使用されるProductためProductViewModel、データベース内の ID に対応する ID プロパティがあります。

ID をコントローラーに戻すために、ビューのフォームでこれを行っています。

@Html.HiddenFor(x => x.Id)

これは機能しますが、IDをコントローラーにポストするより良い方法があるかどうか疑問に思っていましたか? 多分ルート値?それともこれはかなり標準的なパターン/アプローチですか?

4

2 に答える 2

11

route: に id を含む GET アクションがある場合、/Products/Edit/1通常はそれを route 値として保持します。

[HttpPost]
public ActionResult Edit(int id, EditProductViewModel model)

ただし、これは純粋に私の好みです。それを行う正しいまたは間違った方法はありません。

このメソッドの良いところは、URL の一部であるため、Hidden 値を使用して渡す必要がなくなったことです。実際、Hidden 値を渡しても無視されると思います。

別の方法として、id はルートの一部であるため、別のパラメーターを指定する必要さえありません。

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

public class EditProductViewModel 
{
    public int Id { get; set; }
}

繰り返しますが、これは純粋に好みの問題です。

于 2012-06-22T13:27:42.223 に答える
1

答えは場合によると思います。

オブジェクト全体が編集され、ポストバックされていますか? もしそうなら、モデルの一部として ID をポストバックすることをお勧めします:

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

これは完全に有効なことだと思います。ただし、注意してください。編集中のリソースが保護されたリソースである場合は、ユーザーが正しい権限を持っていることを確認してください。

それが部分的な編集である場合、おそらく Ajax 呼び出しを介してコメントを編集するだけで、おそらくやりたくなるでしょう:

[HttpPost]
public ActionResult Edit(int id, string comment)

そのシナリオでモデルを作成すると、やり過ぎだと思います...特権の問題はまだ適用されます:)

そうは言っても、私自身は専門家ではありません:)

ちなみに…隠しフィールドは特に問題ないと思います、ずっと使ってます。ただし、これは ajax 呼び出しであり、投稿する ajax 呼び出しの一部であるため、必要ない場合があります。

于 2012-06-22T13:39:11.833 に答える