【发布时间】:2014-12-18 22:42:15
【问题描述】:
我正在尝试通过 HttpPost 将模型数据从视图(以及视图中的 PartialView)传回控制器。 (改编自Pass SelectedValue of DropDownList in Html.BeginForm() in ASP.NEt MVC 3)
为什么?我想显示一个资产列表,每个资产都有一个 DropDownList 和选项数量。提交表单后从 DropDownList 中读取所选项目。
我的 2 个(简化)模型:
public class Booking
{
public int BookingID { get; set; }
public int StoreID { get; set; }
...
public IEnumerable<AssetShort> Assets { get; set; }
}
和
public class AssetShort
{
public int AssetID { get; set; }
....
public int SelectedAction { get; set; }
public IEnumerable<SelectListItem> ActionList { get; set; }
}
在我的 Booking Controller > Create 中构建列表:
public ActionResult Booking(int id)
{
// get myBag which contains a List<Asset>
// booking corresponds to 'id'
var myAssets = new List<AssetShort>();
foreach (var a in myBag.Assets)
{
var b = new AssetShort();
b.AssetID = a.ID;
b.SelectedAction = 0;
b.ActionList = new[]
{
new SelectListItem { Selected = true, Value = "0", Text = "Select..."},
new SelectListItem { Selected = false, Value = "1", Text = "Add"},
new SelectListItem { Selected = false, Value = "2", Text = "Remove"},
new SelectListItem { Selected = false, Value = "3", Text = "Relocate"},
new SelectListItem { Selected = false, Value = "4", Text = "Upgrade"},
new SelectListItem { Selected = false, Value = "5", Text = "Downgrade"}
};
myAssets.Add(b);
};
var model = new BookingRequirementsViewModel
{
BookingID = booking.ID,
StoreID = booking.StoreID,
Assets = myAssets.ToList(),
};
return View(model);
我的观点:
@model uatlab.ViewModels.BookingRequirementsViewModel
@{
ViewBag.Title = "Booking step 2";
}
<h4>Your booking ref. @Model.BookingID</h4>
@using (Html.BeginForm("Booking2", "Booking", FormMethod.Post))
{
<fieldset>
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.StoreID)
@Html.Partial("_Assets", Model.StoreAssets)
<input type="submit" value="Cancel" class="btn btn-default" />
<input type="submit" value="Next" class="btn btn-default" />
</fieldset>
}
部分视图包括
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Number</td>
<td>@Html.DropDownListFor(modelItem=>item.SelectedAction, item.ActionList)</td>
</tr>
}
因此,所有这些在浏览器中都可以正常工作,我可以为列出的每个资产选择下拉列表,但是当我提交时,唯一回发的值是 StoreID,因为它在“HiddenFor”中。
booking2 控制器有一个参数的模型:
public ActionResult Booking2(BookingRequirementsViewModel model)
{
//loop through model.Assets and display SelectedActions
}
让我澄清一下问题所在 - 在 Booking2 控制器中,在调试模式下查看时模型为空,并且我收到错误“对象引用未设置为对象的实例”。
请教如何将模型从视图传回控制器?
问候 克雷格
【问题讨论】:
-
您不能使用分部在集合中生成控件。如果您检查 html,您将看到您有重复的
name属性(以及重复的id属性,这是无效的 html)。您需要在主视图中使用for循环,或者为Assets使用自定义EditorTemplate
标签: asp.net-mvc http-post