3

それは私の最初のasp.net mvcアプリケーションです。ビューに mvc 3 と razor を使用しています。私が問題を抱えている特定のビューは、強く型付けされたビューです (少なくとも私はそうだと思います) が、この種の型を受け入れます:

@model List<List<DataAccess.MCS_DocumentFields>[]>

メイン ビューは非常にカスタマイズされており、データのさまざまな部分にさまざまなロジックが必要であるため、いくつかの部分ビューを作成しました。私の部分的なビューも強く型付けされています(これは正しいと思います) type :

@model List<DataAccess.MCS_DocumentFields>[]

ビューを構築するために必要なものはすべて次の場所にあります。

@using (Html.BeginForm("ActionMethodName", "Forms", FormMethod.Post))
{
    <div id="drawForm">
        <table border="1">

内部Hhtml.BeginFormでは、コントローラーからのすべてのデータを使用してテーブルを作成します。今すぐ提出してください:

<button type="submit">Submit</button>

データを取得し、データベースで変更内容を更新する最良の方法を探しています。私のコントローラーには、次のメソッドがあります。

[HttpPost]
        public ActionResult ActionMethodName(FormCollection collection)
        {
            var test = collection;
            List<MCS_Documents> model = DocumentsService.All().ToList();
            return View("Index", model);
        }

この方法で自分のデータを見つけることができますが、非常に複雑で、どうすれば取得できるかさえわかりません。同じ方法を使用して、ビューが受け入れるタイプを引数として受け入れて、別のことを試しました:

[HttpPost]
            public ActionResult ActionMethodName(List<List<DataAccess.MCS_DocumentFields>[]> collection)
            {

しかし、私がそうすると、コレクションには null 値が含まれます。そして、強く型付けされたビューを使用するときに知っていることから、form.validation や更新の準備が整ったデータ バインディングなどの追加の利点を得ることができます...

私の特定のシナリオでは、フォームから送信されたデータを処理するための最良の方法は何ですか?

PS

これが私のメインビューをレンダリングする方法です:

<table border="1">
            <colgroup>
            <col span="1" style="width: 10%;" />
            <col span="1" style="width: 40%;" />
            <col span="1" style="width: 25%;" />
            <col span="1" style="width: 25%;" />
            </colgroup>
            <tbody>
                @for (int i = 0; i < Model.Count(); i++)
                {
                    if (Model[i][0][0].ContentTypeId == 1)
                    {
                        @Html.Partial("_PartialHeader", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 2)
                    {
                        @Html.Partial("_PartialDrawing", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 3)
                    {
                        @Html.Partial("_PartialBody", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 4)
                    {
                        @Html.Partial("_PartialFooter", Model[i])
                    }
                }
            </tbody>
        </table>
        <button type="submit">Save</button>

これは私のパーシャルの 1 つで、使い方を紹介するためのものです。

@model List<DataAccess.MCS_DocumentFields>[] 
        <tr>          
                @if (!string.IsNullOrEmpty(Model[0][0].FieldValue))
                { 
                    <td colspan="2">
                    @Html.DisplayFor(x => x[0][0].FieldValue)
                    </td>
                }
                else
                { 
                    <td colspan="2">
                    Sign in here
                    </td>
                }         

                @if (!string.IsNullOrEmpty(Model[1][0].FieldValue))
                { 
                    <td colspan="2">
                    @Html.DisplayFor(x => x[1][0].FieldValue)
                    </td>
                }
                else
                { 
                    <td colspan="2">
                    Sign in here
                    </td>
                }        

        </tr>
4

1 に答える 1

2

最後のアクション メソッドは正しいですが (これは強力な型を取ります)、ビューを別の方法で構造化する必要があります。すべてのコレクション (サブ コレクションも含む) が正しくインデックス付けされていることを確認する必要があります。そうしないと、モデル バインディングが失敗します。

ビューは次のようになります (forループの使用に注意してください)。

メイン ビュー:

@model List<List<DataAccess.MCS_DocumentFields>[]>

@for (int i = 0; i < Model.Count; i++)
{
    @Html.RenderPartial("PartialName", Model[i])
}

次に、パーシャルで:

  @model List<DataAccess.MCS_DocumentFields>[]

  @for (int i = 0; i < Model.Count; i++)
  {
      //Not sure if you need anything at this level
      for (int j = 0; j < Model[i].Count(); j++)
      {
          //Add your EditorFor's, HiddenFor's etc for the child type
      }
  }
于 2013-05-14T15:29:13.103 に答える