【发布时间】:2014-11-04 10:14:29
【问题描述】:
我正在尝试将我的模型传回控制器。我已经在表单中包含了模型的所有字段,但是模型的两个部分一旦返回控制器Employees 和EmployeesInMultipleCompanies 就会丢失,它们都是IList 类型。我已经验证了这些字段在传递给视图时存在,它们只是没有返回给控制器。
.cshtml
@using (Html.BeginForm("PostEmail","Import",FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>EmailViewModel</legend>
<p>
<input type="email" name="EmailAddresses" value=" " required="required" />
<span class="btn_orange"><a href="#" class="remove_field" >x</a></span>
</p>
<p>
<span class="btn_orange"><a class="add_email_button" href="#">Add Another Email</a></span>
</p>
@Html.HiddenFor(m=> Model.Employees)
@Html.HiddenFor(m=> Model.CompanyId)
@Html.HiddenFor(m=> Model.CompanyName)
@Html.HiddenFor(m=> Model.PayFrequency)
@Html.HiddenFor(m=> Model.FirstPayPeriodBeginDate)
@Html.HiddenFor(m=> Model.LastPayPeriodEndDate)
@Html.HiddenFor(m=> Model.NumberPayPeriods)
@Html.HiddenFor(m=> Model.ValidEmployees)
@Html.HiddenFor(m=> Model.InvalidEmployees)
@Html.HiddenFor(m=> Model.EmployeesInMultipleCompanies)
@Html.HiddenFor(m=> Model.TotalEmployeeCount)
<p>
<input type="submit" value="Send Email" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Cancel", "Continue", "Import")
</div>
<script type="text/javascript">
$(document).ready(function () {
$('body').on('click', '.remove_field', function () {
$(this).closest('p').remove();
});
$('.add_email_button').closest('p').click(function () {
var html = '<p><input type="email" required="required" name="EmailAddresses" /><span class="btn_orange"><a href="#" class="remove_field">x</a></span></p>';
$(html).insertBefore($(this));
});
$(body).on('click', 'submit', function() {
$('email').attr('required', true);
});
});
</script>
控制器.cs
public ActionResult SendEmail(ImportViewModel model)
{
var editedEmployees = model.EmployeesInMultipleCompanies;
var importModel = TempData["ImportModel"] as ImportViewModel;
//for each employee who is in multiple companies, set user-chosen company id and the COHD related to that company
var importService = new ImportService();
importService.UpdateEmployeesInMultipleCompanies(editedEmployees, importModel.Employees);
TempData["ImportModel"] = importModel;
return this.RazorView("SendEmail", importModel);
}
[HttpPost]
public ActionResult PostEmail(ImportViewModel model)
{
IEmailer emailer = new Emailer();
emailer.SendEmail(model.EmailAddresses, model.Employees);
var employees =
model.Employees.Where(e => !string.IsNullOrWhiteSpace(e.ValidationErrorOrException)).ToList();
var emailViewModel = new EmailViewModel(employees);
return this.RazorView("Continue", emailViewModel);
}
【问题讨论】:
-
我会考虑不将它们呈现在单个隐藏中,而是呈现具有相同名称和不同值的多个输入。 DefaultModelBinder 将看到这一点并将其解释为集合类型,它应该可以正常工作。或者,您可以创建一个自定义模型绑定器,将存储在单个隐藏中的值拆分。
-
还要小心 TempData,因为它在幕后使用会话(这不一定是坏事,除非您在网络农场中)并且应该只在重定向时使用:stackoverflow.com/questions/1500402/…。还有很多人会考虑使用 TempData 代替强类型的 ViewModel/其他持久性机制来成为代码异味:stackoverflow.com/questions/386681/…。
-
@xDaevax 感谢您的通知。我将来会考虑它,因为现在它已经在服务器其他视图中我只是在我的使用它。
标签: c# asp.net forms asp.net-mvc-4