2010-07-06 100 views
0

长话短说,我试图向ViewData添加一些额外的项目以使我的生活更轻松,并且它的边缘案例并不真正证明其自己的模型仅适用于这一例。继续阅读更多具体细节。ASP.NET MVC使用DropDownList的强类型化视图

所以我有一个强类型的编辑视图为我的一个对象,一切都很好,直到我试图将一个下拉列表放在视图上,并且ID与我的类的属性不匹配。

我有这个

public class MyModel 
{ 
    public String Name {get;set;} 
    public int ID {get;set;} 
    public MyOtherModel Other {get;set;} 
} 
public class MyOtherModel 
{ 
    public String Name {get;set;} 
    public int ID {get;set;} 
} 

我能够更新Name属性。

我也想从DropDownList中设置Other.ID属性,但它不让我这样做。

我的控制器看起来像这样

public ActionResult EditView() 
{ 
    var da = new DataAccessClass(); 
    var Names = da.ReadActive(); // returns MyOtherModel 
    var sli = new SelectList(evNames, "ID", "Name"); 
    ViewData["OtherModelNames"] = sli; 
    return View(); 
} 

我的视图看起来是这样的:

<p> 
    <label for="EndTime">Name:</label> 
    <%= Html.TextBox("Name") %> 
    <%= Html.ValidationMessage("Name", "*")%> 
</p> 
<p> 
    <label for="EndTime">Other Name:</label> 
    <%= Html.DropDownList("OtherNameIDList", (SelectList)ViewData["OtherModelNames"]) %> 
    <%= Html.ValidationMessage("OtherNameIDList", "*")%> 
</p> 

我得到一个错误,在这条线<%= Html.DropDownList("OtherNameIDList", (SelectList)ViewData["Names"]) %>

“没有ViewData的项目与关键'IEnumerable'类型的'OtherNameIDList'。“

我的期望是,在接受POST的控制器操作中,我将手动使用FormCollection []读出该ID并使用正确的ID填充MyOtherModel。

+0

一个问题是,您在您的操作中设置ViewData [“OtherModelNames”],但在视图中期待ViewData [“名称”]。 – Tahbaza 2010-07-06 20:07:01

+0

谢谢,我修正了这个问题,因为这个问题是匿名的。 ;) – Nate 2010-07-06 20:18:13

回答

1

在控制器尝试:

public ActionResult EditView() 
{ 
    var da = new DataAccessClass(); 
    var Names = da.ReadActive(); // returns MyOtherModel 
    var sli = new SelectList(evNames, "ID", "Name"); 
    ViewData.Add("OtherModelNames", new SelectList("ID", "Name", "")); 
    return View(); 
} 

的视图

Html.DropDownList("OtherModelNames") 

要在下拉列表获得Other.Id,只在类中创建一个静态INT:

public static int OtherId {get { return this.Other.Id; }}