4

ASP.NETMVCとViewからControllerへのデータの受け渡しに問題があります。私はこのようなモデルを持っています:

 public class InputModel {
   public List<Process> axProc { get; set; }

   public string ToJson() {
     return new JavaScriptSerializer().Serialize(this);
   }
 }

 public class Process {
   public string name { get; set; }
   public string value { get; set; }
 }

このInputModelをコントローラーで作成し、ビューに渡します。

public ActionResult Input() {
  if (Session["InputModel"] == null)
    Session["InputModel"] = loadInputModel();
  return View(Session["InputModel"]);
}

Input.cshtmlファイルには、入力フォームを生成するためのコードがあります。

@model PROJ.Models.InputModel

@using(Html.BeginForm()) {
  foreach(PROJ.Models.Process p in Model.axProc){
    <input type="text" />
    @* @Html.TextBoxFor(?? => p.value) *@
  }
  <input type="submit" value="SEND" />
}

次に、送信ボタンをクリックすると、テキストフィールドに入力されたデータを操作したいと思います。

質問1:この@ Html.TextBoxFor()を見たことがありますが、実際にはこの「stuff=>otherstuff」を取得していません。「その他」は、データを書き込みたいフィールドである必要があると結論付けました。この場合は、おそらく「p.value」になります。しかし、矢印の前にある「もの」とは何ですか?

コントローラに戻ると、デバッグを伴うPOST用の関数があります。

[HttpPost]
public ActionResult Input(InputModel m) {
  DEBUG(m.ToJson());
  DEBUG("COUNT: " + m.axProc.Count);

  return View(m);
}

ここで、デバッグは次のようなものだけを表示します。

{"axProc":[]}
COUNT: 0

したがって、返されたモデルは空です。

質問2:この@using(Html.BeginForm())で根本的に間違ったことをしていますか?これはここでの正しい選択ではありませんか?もしそうなら、どうすれば私のモデルをデータで満たしてコントローラーに戻すことができますか?
(ここでは「@modelList <Process>」を使用できません(上記の例は省略されているため、実際のコードではさらに多くのものがあります)。

誰かが私が見落としている詳細のいくつかを私に記入してくれることを願っています。

4

2 に答える 2

2

フォーム送信時にリストを適切にバインドするには、ビューをこのようなものに変更します。

@using(Html.BeginForm()) {
  for(int i=0;i<Model.axProc.Count;i++){
   <span>
    @Html.TextBoxFor(model => model.axProc[i].value)
</span>
  }
  <input type="submit" value="SEND" />
}
于 2012-05-30T16:03:55.967 に答える
0
  1. @ Html.TextBoxFor(stuff => otherstuff)では、stuffはビューのモデルであり、otherstuffはモデルのパブリックメンバーです。
  2. ビューでは、コレクションタイプ(リスト)のモデルメンバーの入力要素をレンダリングする必要があるため、最初に、そのコレクションの単一アイテム(プロセス)をレンダリングするための個別の部分ビューを作成する必要があります。次のようになります(たとえば、Process.cshtmlという名前を付けて、/ Views / Sharedフォルダーに配置します)。

    @model List<PROJ.Models.Process>
    
    @Html.TextBoxFor(model => p.value)
    

次に、メインビューは次のようになります。

@model PROJ.Models.InputModel

@using(Html.BeginForm()) {
  foreach(PROJ.Models.Process p in Model.axProc){
    @Html.Partial("Process", p)
  }
  <input type="submit" value="SEND" />
}

また、loadInputModel()メソッドが実際に何かを返すことを確認します。たとえば、空のリストではありません。

于 2012-05-30T15:19:19.723 に答える