2013-02-17 52 views
0

我的域对象Store保存到对象Chain的引用:C#对象引用控制器

public class Store 
{ 
    public Chain Chain { get; set; } 
} 

在创建一个新的存储有设置相关联链的可能性。我通过传递通过ViewBag链条对象实现这一点,并使用Html.DropDownListFor选择:

@Html.DropDownListFor(
    x => x.Chain, 
    new SelectList(ViewBag.Chains, "Id", "Name")) 

到目前为止好,但早在控制器(提交后)链属性为null。我想我可以将DropDownList设置为Chain.Id,但我需要再次加载实体。有没有更好的方法来获得/保持正确的参考?

回答

2

有没有更好的方法来获取/保持正确的参考?

不,这就是HTML的工作原理。只有选定的值被发送到服务器,并且您需要使用此值来加载相应的实体。在进入ASP.NET MVC开发之前,请学习HTML。这对你非常有帮助。这是正确的做法:

@Html.DropDownListFor(
    x => x.Chain.Id, 
    new SelectList(ViewBag.Chains, "Id", "Name") 
) 

那么,作为一个真正的事实问题,是完全老实跟你来处理这个最正确的方法是摆脱所有ViewBag废话和使用一个真正的视图模型您的应用程序:

@Html.DropDownListFor(
    x => x.ChainId, 
    Model.AvailableChains 
) 

其中AvailableChains当然会IEnumerable<SelectListItem>类型的你对这一观点的准备视图模型的属性。您应该始终使用视图模型,并且如果您想要以ASP.NET MVC 的正确方式将您的域模型传递给视图。

而且这里是你的视图模式如何看起来像:

public class MyViewModel 
{ 
    public int ChainId { get; set; } 
    public IEnumerable<SelectListItem> AvailableChains { get; set; } 
} 
+0

谢谢!嗯,这听起来不像一个干净的编程风格,只需设置关联元素的Id,然后在域对象中加载并重新分配它!我认为该是ViewModel的时候了! – core 2013-02-17 22:50:22

+0

交叉帖子与相同的想法:-)再次感谢,我会听从你的意见! – core 2013-02-17 22:53:56