0

テキストファイルがあり、ユーザーがファイルをアップロードすると、コントローラーアクションメソッドはステートマシンを使用してそのファイルを解析し、汎用リストを使用していくつかの値を格納します。これをIEnumerableの形式でビューに返します。メインビュー内で、この無数のリストに基づいて、部分ビューをレンダリングしてアイテムを反復処理し、ラベルとテキストエリアを表示します。ユーザーは、テキスト領域に入力を追加できます。ユーザーが保存ボタンを押すと、レンダリングされた部分ビューからのこの無数のリストはnullになります。だから、どんな解決策もアドバイスしてください。

これが私のメインビューです

@model RunLog.Domain.Entities.RunLogEntry
@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";

}

   @using (Html.BeginForm("Create", "RunLogEntry", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {

<div id="inputTestExceptions" style="display: none;">
        <table class="grid" style="width: 450px; margin: 3px 3px 3px 3px;">
            <thead>
                <tr>
                    <th>
                        Exception String
                    </th>
                    <th>
                        Comment
                    </th>
                </tr>             </thead>

            <tbody>
                @if (Model.TestExceptions != null)
                {
                    foreach (var p in Model.TestExceptions)
                    {
                        Html.RenderPartial("RunLogTestExceptionSummary", p);

                    }
                }
            </tbody>
        </table>

    </div>
     }

次のように部分的なビュー:

@model RunLog.Domain.Entities.RunLogEntryTestExceptionDisplay
<tr>
    <td>
    @Model.TestException@
       </td>
        <td>@Html.TextAreaFor(Model.Comment, new { style = "width: 200px; height: 80px;" })
    </td>
</tr>

コントローラのアクション

[HttpPost]
    public ActionResult Create(RunLogEntry runLogEntry, String ServiceRequest, string Hour, string Minute, string AMPM,
                                 string submit, IEnumerable<HttpPostedFileBase> file, String AssayPerformanceIssues1, IEnumerable<RunLogEntryTestExceptionDisplay> models)
    {

}

問題は、例外文字列を含むテスト例外であり、コメントがnullに戻ってきます。

アップデート

public class RunLogEntry
{
   SOME OTHER FIELDS

    [NotMapped]
    public IEnumerable<RunLogEntryTestExceptionDisplay> TestExceptions { get; set; }
}



public class RunLogEntryTestExceptionDisplay
{
    public string TestException { get; set; }
    public string Comment { get; set; }
}



@using (Html.BeginForm("Create", "RunLogEntry", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
         if (Model.TestExceptions != null)
           {
               if (Model.TestExceptions.Count() > 0)
               {
        <div class="bodyContent">
            <span class="leftContent">
                @Html.Label("Test Exceptions")
            </span><span class="rightContent"><span id="TestExceptionChildDialogLink" class="treeViewLink">
                Click here to View Test Exceptions</span>
                <br />
                <span id="TestExceptionDisplay"></span>
                @Html.HiddenFor(model => model.TestExceptions)
                @*<input id="ExceptionString" type="hidden" value="@Model.ExceptionString" />*@
            </span>
        </div>
               }
           }


   <div id="inputTestExceptions" style="display: none;">
        <table class="grid" style="width: 450px; margin: 3px 3px 3px 3px;">
            <thead>
                <tr>
                    <th>
                        Exception String
                    </th>
                    <th>
                        Comment
                    </th>
                </tr>
            </thead>
            @if (Model.TestExceptions != null)
            {
                var index = 0;
                foreach (var p in Model.TestExceptions)
                {
                <tr>
                    <td>@p.TestException
                        <input type="hidden" name="RunLogEntry.TestExceptions[@index].ExceptionString" value="@p.TestException" />
                    </td>
                    <td>
                        <textarea name="RunLogEntry.TestExceptions[@index].Comment" style ="width: 200px; height: 80px;">@p.Comment</textarea>
                        <input type="hidden" name="RunLogEntry.TestExceptions[@index].Comment" value="@p.Comment" />
                    </td>
                    @* Html.RenderPartial("RunLogTestExceptionSummary", p);*@
                </tr>
                                                                                                 index++;
                }

            }
        </table>
    </div>
}
4

1 に答える 1

0

コレクションを投稿するには、フォーム要素に配列スタイルで名前を付ける必要があります。また、html 要素名/ID に配列インデックスを設定できるように、カウンターを保持する必要があります。

@{var index = 0;}
@foreach (var p in Model.TestExceptions) {
  <tr>
    <td>
      @Model.TestException@
     </td>
      <td>
          <textarea name="@Html.FieldNameFor(m => m.TestExceptions[@index].Comment" id="@Html.FieldIdFor(m => m.TestExceptions[@index].Comment" style ="width: 200px; height: 80px;">@p.Comment</textarea>
          <input type="hidden" name="@Html.FieldNameFor(m=> m.TestExceptions[@index].ExceptionString" id="@Html.FieldIdFor(m=> m.TestExceptions[@index].ExceptionString" value="@p.ExceptionString" />
      </td>
  </tr>
index++;
}

モデルがどのように見えるかはわかりませんが、例外文字列について言及したので、非表示のフォーム要素を使用して「ExceptionString」プロパティの値を保存し、POST 時にモデル バインディングがこれらの値を取得できるようにしました。

RunLogEntry クラスに TestExceptions コレクション以外のプロパティがある場合は、RunLogEntry プロパティにマップされるフォーム要素を含めることで、POST で正しくバインドされるようにすることができます。たとえば、RunLogEntry.Foo プロパティがある場合は、これを上記のループの外に置きます。

<input type="hidden" name="RunLogEntry.Foo" value="@Model.Foo" />
于 2012-09-21T15:46:16.930 に答える