0

モデル内の単純なリストをコントローラーに投稿しようとしています。正しくレンダリングされますが、ポストでは常に空です。id に @Html.Hidden を使用すると、インスタンス id と名前が異なるため、名前が異なることに気付きましTestExceptionDisplay_[0]__ExceptionTestExceptionDisplay[0].Exception。そのため、入力タイプを使用して、レンダリングするのが好きな方法を作成しようとしましたが、機能しません。部分ビュー、エディター テンプレートを試しましたが、何も機能しないようです。TestException Display は、と呼ばれるオブジェクトの非常に単純なリストです。 public List<RunLogEntryTestExceptionDisplay> TestExceptionDisplay { get; set; }

public class RunLogEntryTestExceptionDisplay
{
    public string Exception { get; set; }
}

for ループを使用してリストをレンダリングするビューのスニペット、リストは正常にレンダリングされますが、ポスト TestExceptionDisplay は常に NULL です。

@if (Model.TestExceptionDisplay != null)
{
    for (var i = 0; i < Model.TestExceptionDisplay.Count; i++)
    {
    <tr>
        <td>
            @Model.TestExceptionDisplay[i].Exception
            @*@Html.HiddenFor(m => m.TestExceptionDisplay[i].Exception)*@
            <input  name="RunLogEntry.TestExceptionDisplay_[@i]__Exception" type="hidden" value="@Model.TestExceptionDisplay[i].Exception" />
        </td>
    </tr>
    }
}

または、これは投稿時にエディター テンプレートでも機能しません

  @if (Model.TestExceptionDisplay != null)
                {

                    @Html.EditorFor(x => x.TestExceptionDisplay)

                }

RunLogEntryTestExceptionDisplay の正確な名前を持つ Shared\EditorTemplates のエディター テンプレート

@model RunLog.Domain.Entities.RunLogEntryTestExceptionDisplay
<div>
    @Html.EditorFor(x => x.Exception)
    @Html.HiddenFor(x => x.Exception)
</div>

レンダリングされた HTML は以下のようになります。リスト全体をコピーしたわけではありません。ID と名前が異なる命名規則でレンダリングされているように見えないことに注意してください。エディター テンプレートまたは for ループを使用すると、どちらの場合にも発生します。ありがとう

 <input id="TestExceptionDisplay_9__Exception" name="TestExceptionDisplay[9].Exception" type="hidden" value="&quot;1404 TestException - Parameters:Unable to calculate result, assay is not calibrated for Assay Number (135), Assay Version (5), Track (1), Lane (2), and Reagent Lot Number (26600LI06)&quot;" />

デバッグビュー

完全なビュー:

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

    }
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/errorCode.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/testexception.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/runLogEntry.js")" type="text/javascript"></script>
    <script type="text/javascript">
        var runlogListErrorsUrl = '@Url.Action("ListErrorCodes", "RunLogEntry")';


    </script>
    <fieldset>
        <legend>Enter a new Run Log Entry</legend>
        @using (Html.BeginForm("Create", "RunLogEntry", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            @Html.ValidationSummary(true)
            <div class="exception">@(ViewBag.ErrorMessage)</div>
            <div class="bodyContent">
                <span class="leftContent">Load List File (Select): </span><span class="rightContent">
                    <input type="file" name="file" id="file1" style="width: 500px" />
                </span>
            </div>
                               if (Model.LoadListStoredFileName != null)
                               {
            <div class="bodyContent">
                <span class="leftContent">Attached Load List: </span><span class="rightContent">
                    @Html.ActionLink(Model.LoadListFileName, "Download", new { @file = Model.LoadListStoredFileName })
                </span>
            </div>
                               }
            <div class="bodyContent">
                <span class="leftContent">Output File (Select): </span><span class="rightContent">
                    <input type="file" name="file" id="file2" style="width: 500px" />
                </span>
            </div>
                               if (Model.OutputStoredFileName != null)
                               {
            <div class="bodyContent">
                <span class="leftContent">Attached Output: </span><span class="rightContent">
                    @Html.ActionLink(Model.OutputFileName, "Download", new { @file = Model.OutputStoredFileName })
                </span>
            </div>
                               }
            <div class="bodyContent">
                <span class="leftContent">Import Files: </span>
                <button name="submit" class="art-button" type="submit" value="Upload" style="width: 100px">
                    Upload</button>
                <button name="submit" class="art-button" type="submit" value="Remove" style="width: 100px">
                    Remove</button>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Operator")
                </span><span class="rightContent">
                    @Html.DropDownList("OperatorID", String.Empty)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Run ID")
                </span><span class="rightContent">[Generated] </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Run Start Date / Time")
                </span><span class="rightContent">
                    @Html.EditorFor(model => model.RunDate)
                    &nbsp;
                    @Html.DropDownList("Hour", ListHelpers.HourList())
                    :
                    @Html.DropDownList("Minute", ListHelpers.Minute15List())
                    &nbsp;
                    @Html.DropDownList("AMPM", ListHelpers.AMPMList())
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("System")
                </span><span class="rightContent">
                    @Html.DropDownList("SystemID", String.Empty)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Run Type")
                </span><span class="rightContent">
                    @Html.DropDownList("RunTypeID", String.Empty)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Run Description")
                </span><span class="rightContent">
                    @Html.TextAreaFor(model => model.RunDescription, new { style = "width: 600px; height=30px" })
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Assay Performance Issues")
                </span><span class="rightContent">
                    @Html.DropDownList("AssayPerformanceIssues1", ListHelpers.YesNoList())
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Tests/Cycles Requested")
                </span><span class="rightContent">
                    @Html.EditorFor(model => model.SPTestsRequested)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Tests/Cycles Completed")
                </span><span class="rightContent">
                    @Html.EditorFor(model => model.SPTestsCompleted)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Run Status")
                </span><span class="rightContent">
                    @Html.DropDownList("RunStatusID", String.Empty)
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Assay")
                </span><span class="rightContent">
                    @Html.ListBoxFor(model => model.SelectedAssayIDs, new MultiSelectList(RunLog.Domain.Lists.GlobalList.AssayListItems(), "ID", "Name", Model.SelectedAssayIDs))
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Error Code")
                </span><span class="rightContent"><span id="ChildDialogLink" class="treeViewLink">Click
                    here to Select Error Codes</span>
                    <br />
                    <span id="ErrorCodeDisplay" style="cursor: pointer; text-decoration: underline;">@(Model.ErrorDescription)</span>
                    @Html.HiddenFor(model => model.ErrorDescription)
                </span>
            </div>

            <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="TestExceptionDisplayy"></span></span>
            </div>
            <div id="testExceptiontreeview" title="Dialog Title" style="font-size: 10px; font-weight: normal;
                overflow: scroll; width: 800px; height: 450px;">
                <div id="testExceptions">
                </div>
                <div id="inputTestExceptions">
                    <table class="grid" style="width: 450px; margin: 3px 3px 3px 3px;">
                        <thead>
                            <tr>
                                <th>
                                    Exception String
                                </th>
                                <th>
                                    Comment
                                </th>
                            </tr>
                        </thead>
                        @* @{var index = 0;}*@
                        @if (Model.TestExceptionDisplay != null)
                        {
                            for (var i = 0; i < Model.TestExceptionDisplay.Count; i++)
                            {
                            <tr>
                                <td>
                                    @Model.TestExceptionDisplay[i].Exception
                                    @Html.HiddenFor(m => m.TestExceptionDisplay[i].Exception)
                                </td>
                            </tr>

                            }
                        }
                    </table>
                </div>
            </div>

            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Service Entry Request")
                </span><span class="rightContent">
                    @Html.DropDownList("ServiceRequest", ListHelpers.YesNoList())
                </span>
            </div>
            <div class="bodyContent">
                <span class="leftContent">
                    @Html.Label("Problem Description")
                </span><span class="rightContent">
                    @Html.TextArea("ProblemDescription", new { style = "width: 600px; height: 30px" })
                </span>
            </div>
            <p>
                <input id="LogType" type="hidden" value="Run" />
                <input id="ID" type="hidden" value="0" />
                @if (Model.ExitCode == "1")
                {
                    @Html.Hidden("ExitCode", Model.ExitCode)
                }
                else
                {
                    <input id="ExitCode" type="hidden" value='0' />
                }
            </p>

            @Html.HiddenFor(model => model.MaxReplicateId)
            @Html.HiddenFor(model => model.MinReplicateId)
            @Html.HiddenFor(model => model.OutputFileName)
            @Html.HiddenFor(model => model.OutputStoredFileName)
            @Html.HiddenFor(model => model.LoadListFileName)
            @Html.HiddenFor(model => model.LoadListStoredFileName)
            @Html.HiddenFor(model => model.MinTestCompletionDate)
            @Html.HiddenFor(model => model.MaxTestCompletionDate)

            <div class="bodyContent">
                <span class="leftContent"></span><span class="rightContent">
                    <button name="submit" class="art-button" type="submit" value="Create">
                        Create</button></span>
            </div>
        }
    </fieldset>
    <script src="@Url.Content("~/Scripts/exitCode.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/exitCode.js")" type="text/javascript"></script>
    <div id="treeview" title="Dialog Title" style="font-size: 10px; font-weight: normal;
        overflow: scroll; width: 800px; height: 450px;">
        <div id="errorCodes">
            @Html.RenderTree(CacheHelper.ErrorCodes(), ec => ec.Name, ec => ec.Children.ToList(), ec => (ec.ID).ToString(), null, "e")
        </div>
        <div id="inputReps" style="display: none;">
        </div>
    </div>
4

2 に答える 2

1

受け取ったモデルのリストにデータが入力されることを期待しているのはなぜですか?

POSTのモデルには、フォームからのデータのみが入力されます-MVCは、モデルクラスの新しいインスタンスを作成し、一致させることができるフィールドに入力します。

このため、リストにデータが入力されていることを確認するための一般的な方法は、リストにデータを入力するヘルパーメソッドを用意することです。Get次に、元のメソッドまたはメソッドからこれを呼び出してPost、リストを再作成できます。

ポストバック時にPMVによってモデルにリストが入力されると予想されるのは、リストを再構築するための詳細がフォーム要素で利用できる場合のみです。

あなたのコードの範囲でそれを見逃した可能性がありますが、どこでもあなたがそれをしているのを見ることができません。

于 2012-09-25T20:59:06.890 に答える
1

最初のメソッドで初期化listしてから、メソッドに渡す必要がありますpost

于 2012-09-25T20:54:20.870 に答える