2013-05-28 23 views
1

我尝试使用下面的视图模型无法获取ASP.Net MVC编辑行动值得我的ViewModel

public class ProjectViewModel 
{ 
    public Project Project { get; set; } //bulk of the information 
    public int SelectedGovernmentClientId { get; set; } //selected ID for the dropdown 
    public IEnumerable<SelectListItem> GovernmentClients { get; set; } //dropdown values 
} 

这里是我的项目类

public class Project 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    //omitting extra fields 
    public virtual GovernmentClient GovernmentClient { get; set; } 
} 

这里,我有行动

[HttpPost] 
public ActionResult Edit(ProjectViewModel projectViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //i am getting the following from debugging 
     //projectViewModel.Project.GovernmentClient.Name is NULL 
     //projectViewModel.Project.GovernmentClient.ID is the correct ID from the dropdown 
     db.Entry(projectViewModel.Project).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(projectViewModel); 
} 

除政府客户以外,所有的值都得到更新。这是为什么发生?

+1

你调试了代码吗? 'projectViewModel.SelectedGovernmentClientId'的价值是什么?从数据库获取值后,“projectViewModel.Project.GovernmentClient”的值是多少? – Kenneth

+0

'projectViewModel.SelectedGovernmentClientId'返回下拉菜单中的选定值。 'projectViewModel.Project.GovernmentClient'开始为空,但在赋值后包含正确的GovernmentClient对象 – PBG

+1

实体是否附加到上下文? – Kenneth

回答

1

的玩弄此一整天之后,我想我可能已经解决了它

添加以下到我的Project模型

[ForeignKey("GovernmentClient")] 
public int GovernmentClient_ID { get; set; } 

要渲染的下拉列表中,我用这个

@Html.DropDownListFor(model => model.Project.GovernmentClient_ID, Model.GovernmentClients) 

为了生成GovernmentClients列表,我使用下面的方法

private IEnumerable<SelectListItem> GetGovernmentClientsList(int selectedItem = -1) 
{ 
    var defaultItem = Enumerable.Repeat(new SelectListItem 
    { 
     Value = "-1", 
     Text = " - Select a government client - ", 
     Selected = (selectedItem == -1) 
    }, count: 1); 
    var clients = db.GovernmentClients.ToList().Select(x => new SelectListItem 
    { 
     Value = x.ID.ToString(), 
     Text = x.ClientName, 
     Selected = (selectedItem == -1) ? false : (x.ID == selectedItem) 
    }); 
    return defaultItem.Concat(clients); 
} 

总的来说,我对此感到满意,因为我不硬编码任何属性名称,我知道它会回来咬我。

1
projectViewModel.Project.GovernmentClient = 
     db.GovernmentClients.Find(projectViewModel.SelectedGovernmentClientId); 

您正在从数据库中检索值并将其状态设置为已修改。但是,根本没有修改。

+0

我的错误是,我添加了该行以尝试修复它。代码修改。 – PBG

相关问题