【发布时间】:2011-06-23 20:32:36
【问题描述】:
我的视图填充了模型属性,并且一些下拉列表是硬编码的,并通过 viewdata 传递给视图,问题是 Trupdatemodel 仅更新模型值,我无法更新 viewdata 值,下面是更新的代码模型但不是 vidata 下拉列表:
查看:
<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, new { maxlength = "5", 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"], new { maxlength = "5", 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, "ID", "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(), "Value", "Text");
//ViewBag.helmet = new SelectList(helmets.ToList(), "Value", "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(), "Value", "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 只是视图需要,不需要更新
-
我需要更新通过视图数据填充的编辑菜单中的选定列表
-
例如在编辑视图中,如果用户从参加者列表中选择参加者,它应该像为模型所做的那样更新数据库
标签: asp.net-mvc asp.net-mvc-2 viewdata