5

ASP.NET MVC アプリケーションで、1 つのフォームで複数のオブジェクトを送信しようとしています。ポストバックする単純なタイプを取得できますが、複雑なタイプに問題があります。Phil Haack のブログ記事Model Binding To A Listで提供されている例を真似したような気がしますが、うまくいきませんでした。彼のコードを正確にコピーしても無駄です。

ProjectNumオブジェクトのセットのおよびTaskNumプロパティを入力しようとしていMachineLicenseBillbackます。残念ながら、IList<MachineLicenseBillback> machinePtsは投稿されると常に null になります。

私は何が欠けていますか?

クラス

public class MachineLicenseBillback
{
    public MachineLicenseBillback() { }

    public virtual int MachineId { get; set; }
    public virtual string ProjectNum { get; set; }
    public virtual string TaskNum { get; set; }
    public virtual string VerifiedFlag { get; set; }
    public virtual DateTime? RcdChgDateTime { get; set; }
    public virtual string RcdChgAgent { get; set; }
}

アクション

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TrueUp(int id, IList<MachineLicenseBillback> machinePts)
{
  // ...
}

<% using (Html.BeginForm("TrueUp", "Home", new { id = Model.Customer.Id },
             FormMethod.Post))
   { %>
<input type="hidden" name="machinePts.Index" value="<%= machine.MachineId %>" />

<input type="text" name="machinePts[<%= machine.MachineId%>].ProjectNum"
  value="<%= machine.MachineLicenseBillback.ProjectNum %>" />

<input type="text" name="machinePts[<%= machine.MachineId %>].TaskNum"
  value="<%= machine.MachineLicenseBillback.TaskNum %>" />

<input type="submit" value="Submit" />
<% } %>
4

2 に答える 2

2

.Index 構文は MVC 1 RTM で削除され、MVC 2 で再導入されました。MVC 1 では、リスト要素に連続して番号を付ける必要があります: machinePts[0]、machinePts[1] など。

于 2010-01-26T00:23:19.180 に答える
0

Scott Hanselman は、項目のリストをバインドするための完全なウォークスルーをここに持っています。つまり、コントローラ メソッドにはMachineLicenseBillbackではなく の配列が必要IListです。

public ActionResult TrueUp(int id, MachineLicenseBillback[] machinePts)
{
  // ...
}

コードを見て、(IList ではなく) にバインドする場合IDictionaryは、代わりにビューでキーと値のペアを使用できます。または、現在ビューにあるコードを保持し、コントローラー メソッドのパラメーターとして配列を使用することもできます。

命名規則には特に注意してください。命名に不一致がある場合、モデル バインダーはデータを取得しません。

于 2010-01-25T23:38:30.763 に答える