none
MVC2.0 中UpdateModel为什么不能更新数据 RRS feed

  • 问题

  • 最近在看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 一般性问题讨论区)
    2010年10月21日 8:46

答案

  • 程序有误。

    controller传递给view的是DinnerFormViewModel类,而TryUpdateModel的则是Dinner类,所以不能更新。

    • 已标记为答案 Mog Liang 2010年11月8日 2:47
    2010年11月4日 4:55

全部回复

  • 我至少没有看出明显的错误。这样你断点调试一下到Dinnner.GetDinner(int id)看看获得的Dinner是否是空,或者是否出现其它异常情况。

    2010年10月22日 3:31
  • 回去重新试了一下,好象加上那个partial view就不能更新了,如果不加的话是可以更新的,直接看实例还是有很多不理解的地方啊。

    2010年10月24日 4:35
  • 程序有误。

    controller传递给view的是DinnerFormViewModel类,而TryUpdateModel的则是Dinner类,所以不能更新。

    • 已标记为答案 Mog Liang 2010年11月8日 2:47
    2010年11月4日 4:55