积极答复者
MVC2.0 中UpdateModel为什么不能更新数据

问题
-
最近在看MVC 2.0,想通过实例Nerddinner来了解整个设计模式,在更新数据时遇到了问题,UpdateModel好象不能更新数据了,怎么回事?
这是DinnerController里的代码 // GET: /Dinners/Edit/5 public ActionResult Edit(int id) { Dinner dinner = dinnerrepository.GetDinner(id); return View(new DinnerFormViewModel(dinner)); } // // POST: /Dinners/Edit/5 [HttpPost] public ActionResult Edit(int id, FormCollection collection) { Dinner dinner = dinnerrepository.GetDinner(id); if(TryUpdateModel(dinner)) { dinnerrepository.Save(); return RedirectToAction("Index"); } else return View(new DinnerFormViewModel(dinner)); }
这是DinnerRepository里的代码 using System.Collections.Generic; using System.Linq; using System.Web; namespace Nerddinner.Models { public class DinnerRepository { private NerdDinnerEntities entities = new NerdDinnerEntities(); public IQueryable<Dinner> FindAllDinners() { return entities.Dinners; } public IQueryable<Dinner> FindUpcomingDinners() { return from dinner in entities.Dinners where dinner.EventDate > DateTime.Now orderby dinner.EventDate select dinner; } public Dinner GetDinner(int id) { return entities.Dinners.FirstOrDefault(d => d.DinnerID == id); } public void Add(Dinner dinner) { entities.Dinners.AddObject(dinner); } public void Delete(Dinner dinner) { foreach (var rsvp in dinner.RSVPs) { entities.RSVPs.DeleteObject(rsvp); } entities.Dinners.DeleteObject(dinner); } public void Save() { entities.SaveChanges(); } } }
这是DinnerFormViewModel里的代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Nerddinner.Models { public class DinnerFormViewModel { private static string[] _countries = new[]{ "China", "Japan", "USA"}; public Dinner Dinner { get; private set; } public SelectList Countries { get; private set; } public DinnerFormViewModel(Dinner dinner) { Dinner = dinner; Countries = new SelectList(_countries, dinner.Country); } } }
这是Edit.aspx里代码 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Nerddinner.Models.DinnerFormViewModel>" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Edit:<%:Model.Dinner.Title %> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>Edit a Dinner</h2> <%Html.RenderPartial("DinnerForm"); %> </asp:Content> 里面使用了一个DinnerForm的partial view
代码如下:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Nerddinner.Models.DinnerFormViewModel>" %><br/><%:Html.ValidationSummary(false,"请更正所有错误")%><br/><%using (Html.BeginForm()){ %><br/><fieldset><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner.Title) %><br/> <%:Html.TextBoxFor(m=>m.Dinner.Title) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.Title,"*") %><br/></p><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner.EventDate) %><br/> <%:Html.TextBoxFor(m=>m.Dinner.EventDate) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.EventDate,"*") %><br/></p><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner.Description) %><br/> <%:Html.TextAreaFor(m=>m.Dinner.Description) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.Description,"*") %><br/></p><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner.Address) %><br/> <%:Html.TextBoxFor(m=>m.Dinner.Address) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.Address,"*") %><br/></p><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner) %><br/> <%:Html.DropDownListFor(m=>m.Dinner.Country,Model.Countries) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.Title,"*") %><br/></p><br/><p><br/> <%:Html.LabelFor(m=>m.Dinner.ContactPhone) %><br/> <%:Html.TextBoxFor(m=>m.Dinner.ContactPhone) %><br/> <%:Html.ValidationMessageFor(m=>m.Dinner.ContactPhone,"*") %><br/></p><br/><p><input type="submit" value="Save"/></p><br/></fieldset><br/><%} %>
有点长,希望专家有时间了帮我看看,我已经纠结两天了,实在搞不懂。。。<br/>
- 已移动 孟宪会Moderator 2010年10月25日 1:33 (发件人:.NET Framework 一般性问题讨论区)