这是我的观点模型:
public class AgencyViewModel
{
public int VendorId { get; set; }
public IEnumerable<Vendor> Vendors { get; set; }
public HttpPostedFileBase SpreadsheetFile { get; set; }
}
以下是我的两种控制器方法:
public ActionResult Upload()
{
var viewModel = new AgencyViewModel
{
Vendors = _vendorsRepository.Vendors.OrderBy(v => v.Name)
};
return View(viewModel);
}
[HttpPost]
public ActionResult Upload(AgencyViewModel viewModel)
{
// do stuff
}
我的观点:
@model MyModels.AgencyViewModel
@using (Html.BeginForm("Upload", "Agencies", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
@Html.DropDownListFor(model => model.VendorId,
new SelectList(Model.Vendors, "VendorID", "Name"),
"- Select a Vendor -")
@Html.TextBoxFor(model => model.SpreadsheetFile, new { type = "file" })
<p>
<input type="submit" value="Next" />
</p>
}
当我导航到Upload
时,Vendors
已正确加载。但是,当我提交表单时,我的视图模型只包含VendorId
和SpreadsheetFile
,Vendors
为null
。
我提交表单后需要对Vendors
集合进行一些工作,而且我不想加载所有数据两次。
如何将数据保存在视图模型中?
答案 0 :(得分:2)
你必须再次设置你的ViewData,你可以使用ActionFilter,如果你想保持DRY,另一个选择是覆盖控制器OnActionExecuted方法并在那里加载你的数据。
如果您正在充分利用MVC模式,则只需在验证失败时加载viewdata,因为在这种情况下,您将再次加载相同的视图。
答案 1 :(得分:0)
提交表单后,我们只能使用 name 属性获取HTML控件的值,并使用你的下拉列表在html中获取渲染,如下所示:
<select name="VendorId" id="VendorId"><option value="1">XYZ</option>
这就是为什么你能够获得VendorId的值而不是Model.Vendors的值,因为没有使用名称Vendors创建控件。
您可以将此列表存储在会话中,也可以再次调用数据库过程以在表单提交后获取列表。