如何在视图模型中呈现的模型中检索IEnumerable List,在post上返回到控制器

时间:2012-09-20 21:36:09

标签: jquery asp.net-mvc razor

我有一个文本文件,当用户上传文件时,控制器操作方法使用状态机解析该文件,并使用通用列表存储一些值。我以IEnumerable的形式将其传递回视图。在我的主视图中,基于此可依赖列表,我呈现了一个partail视图来迭代项目并显示标签和textarea。用户可以在文本区域中添加输入。当用户点击保存按钮时,从呈现的局部视图中获取的这个可记录列表为空。所以请建议任何解决方案。

这是我的主要观点

@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>
}

1 个答案:

答案 0 :(得分: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" />