问题描述
||
我的视图填充了模型属性,并且一些下拉列表经过了硬编码,并通过viewdata传递给视图,问题是Trupdatemodel仅更新模型值,我无法更新viewdata值,以下是更新模型但未更新模型的代码viedata下拉列表:
视图:
<div class=\"editor-field\">
<% if (ViewBag.mode != \"edit\")
{ %>
<%: Html.TextBoxFor(model => model.Date)%>
<%}else{%>
<%: Html.TextBoxFor(model => model.Date,new { @Value = Model.Date.ToShortDateString() })%>
<%} %>
<%: Html.ValidationMessageFor(model => model.Date) %>
</div></td></tr><tr><td>Experience level</td><td><div class=\"editor-field\">
<%: Html.DropDownListFor(model => model.ExperienceLevelID,(SelectList)ViewData[\"Experience\"],\"--select--\")%>
<%: Html.ValidationMessageFor(model => model.ExperienceLevelID) %>
</div></td></tr>
<tr><td>No of Attendees</td><td><div class=\"editor-field\">
<%-- <%: Html.DropDownList(\"attendees1\",(SelectList)ViewData[\"attendees1\"],\"--select--\")%>--%>
<% if (ViewBag.mode != \"edit\")
{ %>
<%: Html.DropDownList(\"attendees1\",ViewData[\"attendees1\"] as SelectList,\"--select--\")%>
<%}else{%>
<%: Html.DropDownList(\"attendees1\")%>
<%} %>
<label>£</label> <%: Html.TextBox(\"attendeeCost\",ViewData[\"txtAttendees\"],new { maxlength = \"5\",style = \"width:40px;\" })%> <label>Price/Unit</label>
</div></td></tr>
<tr><td>Second Driver</td><td> <div class=\"editor-field\">
<label>£</label> <%: Html.TextBoxFor(model => model.SecondDriverPrice,style = \"width:40px;\" })%> <label>Price</label>
<%: Html.CheckBoxFor(model => model.SecondDriver) %><label>Free</label>
</div></td></tr>
<tr><td>No of Helmets</td><td><div class=\"editor-field\">
<% if (ViewBag.mode != \"edit\")
{ %>
<%: Html.DropDownList(\"helmets\",ViewData[\"size\"] as SelectList,\"--select--\")%>
<%}else{%>
<%: Html.DropDownList(\"helmets\",\"--select--\")%>
<%} %>
<label>£</label> <%: Html.TextBox(\"unitCosthelmet\",ViewData[\"txtHelmet\"],style = \"width:40px;\" })%> <label>Price/Unit</label>
</div></td></tr>
控制器:
[HttpPost]
public ActionResult Edit(int id,FormCollection collection)
{
ViewBag.mode = \"edit\";
// for dropdown track
ITrackRepository trackResp = new TrackRepository();
IQueryable<Object> tracks = trackResp.GetVenuesSelectlist();
ViewData[\"Venue\"] = new SelectList(tracks,\"VenueID\",\"Name\");
// for dropdown for event type
ITrackdayRepository trackdayResp = new TrackdayRepository();
IQueryable<EventType> eventTypes = trackdayResp.GetAllEventTypes();
ViewData[\"EventTypes\"] = new SelectList(eventTypes,\"ID\",\"Name\");
// for dropdown experience
IExperienceLevelRepository expLevelResp = new ExperienceLevelRepository();
IQueryable<ExperienceLevel> expLevel = expLevelResp.GetAllExperienceLevels().OrderBy(ExperienceLevel => ExperienceLevel.Name);
ViewData[\"Experience\"] = new SelectList(expLevel,\"Name\");
// dropdown for helmets
IProductRepository helmetResp = new ProductRepository();
Product productHelmet = helmetResp.GetProd(id);
var attendeesList = Enumerable.Range(1,80).Select(x => new SelectListItem { Value = x.ToString(),Text = x.ToString() });
ViewData[\"attendees1\"] = new SelectList(attendeesList.ToList(),\"Value\",\"Text\");
// dropdown for helmets
var helmetsList = Enumerable.Range(1,200).Select(x => new SelectListItem { Value = x.ToString(),Text = x.ToString() });
ViewData[\"helmets\"] = new SelectList(helmetsList.ToList(),\"Text\");
//ViewBag.helmet = new SelectList(helmets.ToList(),\"Text\",product.QtyAvailable);
// dropdown for garages
var garagesList = Enumerable.Range(1,50).Select(x => new SelectListItem { Value = x.ToString(),Text = x.ToString() });
ViewData[\"garages\"] = new SelectList(garagesList.ToList(),\"Text\");
Event trackday = trackdayResp.GetEvent(id);
TryUpdateModel(trackday,collection);
if (ModelState.IsValid)
{
// product.DateModified = DateTime.Now;
trackday.DateModified = DateTime.Now;
TempData[\"msg\"] = trackdayResp.Save().ToString();
helmetResp.Save();
return RedirectToAction(\"Index\");
}
else
{
return View(\"Create\");
}
}
解决方法
您需要在模型中为
TryUpdateModel
更新要更新的数据才能更新这些值。如果仅将它们放在ViewData中,则数据将仅传递到视图,并且控制器无法使用TryUpdateModel
更新这些值。
您需要将ViewData中当前存在的选择列表数据包括到Event
对象中,或创建一个将包含要更新的值的对象。然后使用TryUpdateModel
将使用发布的值更新该数据。当您创建此新对象或将其添加到“ 4”时,请在该对象上强烈键入视图,因此您无需在视图中进行ViewData强制转换。