我希望你能幫助我,我對MVC和實體框架相當陌生,並試圖讓我的頭腦。我正在使用MVC4和EF5。MVC控制器沒有綁定ViewModels
這裏是什麼,我試圖做一個概述...
我有兩個實體,網站和SiteType。每個網站可以有多個SiteType,因此它們具有多對多關係。我通過創建3個表格,Site,SiteType和SiteSiteType來建立典型的多對多關係的數據庫。 SiteSiteType只包含2列,SiteId和SiteType Id。
我更新了實體模型和它的工作完美地創造我的實體像這樣的網站...
public partial class Site
{
public Site()
{
this.SiteTypes = new HashSet<SiteType>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public virtual ICollection<SiteType> SiteTypes { get; set; }
}
這對於SiteType
public partial class SiteType { public SiteType() { this.Sites = new HashSet<Site>(); } public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Site> Sites { get; set; } }
現在我使用的是強類型視圖,但是,而不是使用網站作爲類型,我使用我創建一個自定義的ViewModel稱爲SiteViewModel看起來像這樣...
public class SiteViewModel { public Site Site { get; set; } public bool WasPosted { get; set; } public IEnumerable<SiteType> AvailableSiteTypes { get; set; } public IEnumerable<SiteType> SelectedSiteTypes { get; set; } }
這樣做的原因是我想用CheckBoxList的擴展MVC描述here
現在的一切,當我創建一個新的網站,並添加SiteTypes到它,但是工作的時候我試圖編輯和現有的記錄我開始有問題。
這裏是控制我的編輯GET方法....
public ActionResult Edit(int id = 0)
{
Site site = _repository.GetSiteByID(id);
if (site == null)
{
return HttpNotFound();
}
var model = new SiteViewModel();
model.AvailableSiteTypes = _repository.GetSiteTypes();
model.SelectedSiteTypes = site.SiteTypes;
model.Site = site;
return View(model);
}
而且POST方法最初看上去像這樣....
[HttpPost]
public ActionResult Edit(SiteViewModel siteViewModel, int[] siteTypes)
{
if (ModelState.IsValid)
{
_repository.UpdateSite(siteViewModel.Site, siteTypes);
_repository.Save();
return RedirectToAction("Index");
}
siteViewModel.AvailableSiteTypes = _repository.GetSiteTypes();
List<SiteType> selectedSiteTypes = _repository.GetSiteTypes(siteTypes).ToList();
if (selectedSiteTypes.Count > 0)
{
siteViewModel.SelectedSiteTypes = selectedSiteTypes;
}
return View(siteViewModel);
}
現在我遇到的問題是該siteViewModel.Site正在從具有更新數據的表單正確填充,但Id列被設置爲「0」,即使它是一個現有的記錄,而不是一個新的。我已經嘗試了一切,但我無法弄清楚爲什麼。我能得到它的工作的唯一途徑是採取一種「ID」參數,手動將其設置爲這樣的站點對象...
HttpPost]
public ActionResult Edit(int id, SiteViewModel siteViewModel, int[] siteTypes)
{
siteViewModel.Site.Id = id;
......
但相比有多好一切結合它只是感覺真的很亂一起。
這是唯一的方法來做到這一點?我錯過了什麼嗎?
非常感謝您花時間閱讀我的文章。對不起它實在是太長了,我不知道該怎麼解釋呢?