我有一个文本文件,当用户上传文件时,控制器操作方法使用状态机解析该文件,并使用通用列表存储一些值。我以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>
}
答案 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" />