0

次のようなモデルがあるとします。

public class LoginModel
{
  pulbic List<string> UserNames {get; set; }
  public string SelectedUserName {get; set; }
  public string Password {get; set; }
}

また、次のようないくつかのアクション メソッドを備えたコントローラーもあります。

public ActionResult Login()
{
  LoginModel model = null;

  model = new LoginModel();

  // Code to populate the UserNames property of the LoginModel instance (model)...

  return View(model);
}

[HttpPost()]

public ActionResult Login(LoginModel model)
{
  if (ModelState.IsValid == true)
  {
    return RedirectToAction("SomeOtherAction")
  }
  else
  {
    return View(model);
  }
}

View メソッドに渡す前に、モデル オブジェクトの UserNames プロパティを設定する必要があります。これは確かにできることですが、少し汚れているように感じます。それは私を質問に導きます。これを処理するより良い方法はありますか?

4

4 に答える 4

1

これは確かにできることですが、少し汚い感じがします。

汚れていません。それがMVCの仕組みです->ステートレスです。別の方法として、ユーザー名のリストを非表示フィールドとしてフォームに含めて、コントローラーにPOSTで戻すこともできます。ただし、ユーザーがこれらの値を変更できるため、これは信頼できる情報ではありません。したがって、これらの値を信頼する必要がある場合は、バックエンドにそれらの値を照会することをお勧めします。

于 2013-02-18T22:32:33.270 に答える
0

基本的に、これはビューが実際に何をしているかに依存します。確かに、UserNames コレクションを非表示のフォーム フィールドのリストとしてレンダリングする場合、モデル バインディングは http ポスト時にこれを行うことができます。つまり、これが http プログラミングがどのように機能することを意図しているかということです。状態は、get と post の間で固執することを意図していません。

本当にあなたの選択は、あなたが言及したようにそのリストを再構築するか、いくつかの非表示フィールドをレンダリングし(私はそれをお勧めしません)、モデルバインディングを実行させることです。

于 2013-02-18T22:38:34.890 に答える
0

通常、データベース アクセスとビュー モデルへの入力を処理する特定のモデル (および密接に関連するエンティティ) のクラスがあります (ただし、別のレイヤーを追加して、DB アクセスとビュー モデルへのマッピングを分離し、おそらくマッピング フレームワークを利用することもできます)。 . いずれにせよ、そのようなリストが必要な場所ならどこでも呼び出すことができる GetLogins のようなメソッドがあります。おそらく、誰かが友達をリクエストできるログイン名をリストする必要がある友達ページのような他のコントローラーでさえ、不自然な例ですが、アイデアはわかります.

Get メソッドと POST メソッドの両方でページを再表示する必要があるため (エラーの場合は POST)、両方で GetLogins を呼び出して、その DB アクセス コードを両方の場所で繰り返さないようにすることができます。

于 2013-02-18T22:38:55.493 に答える
0

私が理解したように、MVC は、モデルのメソッドで UserNames プロパティを更新する必要があるということです。コントローラーが行う必要があるのは、この関数に必要な引数を渡すことだけです (これに関してはそれ以上のことはありません)。そのようにして、コントローラーは、ロジックがどこに行くべきかをモデルに知ることができる情報を渡しているだけです。

私はasp.netを知らないので、残念ながらコード例を提供できません。

于 2013-02-18T22:36:51.390 に答える