我想通過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; }
}
在我的預訂控制器>創建我生成列表:
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控制器的型號爲NULL在調試模式下查看時,我得到錯誤「對象引用未設置爲對象的實例。「
任何想法,請如何從視圖回傳模型到控制器?
問候 克雷格
您無法使用部分來在集合中生成控件。如果你檢查html,你會看到你有'name'屬性重複(以及重複的'id'屬性是無效的html)。您需要在主視圖中使用'for'循環,或者爲'Assets'使用自定義的'EditorTemplate'。 – 2014-12-18 23:05:24