1

我希望这是一件容易的事。

将 MVC4 与 Entity Framework 4.1 一起使用。

我正在尝试使用从具有自定义视图模型属性的视图传递的某些属性来更新模型。

我有这堂课。

public class SitePage
{
    public System.Guid PageID { get; set; }
    public int PageTypeID { get; set; }
    public string PageTitle { get; set; }
    public Nullable<int> RegionId { get; set; }
    public Nullable<int> LockLevelId { get; set; }
    public System.DateTime UpdatedDate { get; set; }
    public System.Guid UpdatedById { get; set; }
    public System.Guid CreatedById { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public string Url { get; set; }
    public int PageStateId { get; set; }
    public string SummaryImage { get; set; }

}

我的控制器

public ActionResult Update(AddPageViewModel model)
{
 if (ModelState.IsValid)
{
  var g = new Guid(model.PageId);
  SitePage UpdatePage = dbSite.SitePages.FirstOrDefault(m => m.PageID == g);

           //This is a page update. Not updating all properties
            UpdatePage.PageTitle = model.PageTitle;
            UpdatePage.GetFirstSection.PageSectionText.PageText = model.PageText;
            UpdatePage.PageTypeID = (int)SitePageType.PageTypes.CommunityPage;
            UpdatePage.RegionId = model.Region
            UpdatePage.CreatedById = userId;
            UpdatePage.CreatedDate = DateTime.UtcNow;
            UpdatePage.UpdatedById = userId;
            UpdatePage.UpdatedDate = DateTime.UtcNow;

 TryUpdateModel(UpdatePage);
 dbSite.Save();

 return RedirectToAction("Community_test", "Community", new { id = UpdatePage.Url });

}
else
{
     return RedirectToAction("Community_test", "Community");
}
}

将此页面视图模型传递给控制器

public class AddPageViewModel
{
   public string PageTitle { get; set; }
   public string PageText { get; set; }
   public int Region { get; set; }
   public string TagString { get; set; }
   public string ParentPageId { get; set; }
   public string PageId { get; set; }
}

如果我调试我可以看到 SitePage 实例 UpdatePage 在调用 TryUpdateModel 时具有所有正确的值。但是,除了 RegionId 之外的所有值都在数据库中正确更新。RegionId 被设置为空。如果我在服务器上运行跟踪,则 sql 实体框架生成的确实将 RegionId 设置为 null,即使我的模型具有值。这个问题是间歇性的!有时它可以工作,有时它不会。四分之一的人会正确更新,我看不出我哪里出错了。我对这些东西真的很陌生。

我们的类是从数据库生成的,我们使用的是 edmx 文件。我不确定我是否可以对这些类进行任何更改,而不会在下次我们从数据库更新模型时被覆盖。

需要任何想法或更多信息,请给我留言。干杯

4

1 回答 1

1

TryUpdateModel 从表单中获取值并填充给定的模型。这意味着UpdatePage不需要设置任何值。

if (ModelState.IsValid)
{
    var updatePage = dbSite.SitePages.FirstOrDefault(m => m.PageID == model.PageId);

    TryUpdateModel(updatePage);
    dbSite.Save();

    //...
}

最好还指定应更新的属性。

TryUpdateModel(updatePage, new string[] { "PageTitle", "RegionId", etc.. });

关于 RegionId 设置为 Null。

如果我调试我可以看到 SitePage 实例 UpdatePage 在调用 TryUpdateModel 时具有所有正确的值。

之前 TryUpdateModel或之后?

于 2012-06-19T16:44:25.670 回答