2011-02-03 38 views
1

我有一個觀點,那就是從System.Web.Mvc.ViewPage<P>繼承。MVC不同實體的下拉列表

P型有C類型,即屬性,P可能是:

class P 
{ 
    public string Name { get; set; } 
    public C OtherData { get; set; } 
} 

有問題的視圖是用於創建新P,因此我想創建的所有下拉列表可用C's。

所以下拉可能是:

  • C1
  • C2
  • C3
  • C4

我試過在C的創建List<SelectListItem>對象我控制器,然後使用ViewData將它們傳遞給視圖,但這不起作用,因爲當我嘗試su bmit我得到異常:

System.InvalidOperationException: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key C.

所以我的問題是,如何創建C對象的列表在我看來,從P類型繼承來顯示。對象列表是從數據庫中提取的,因此我不能直接將選項硬編碼到視圖中。

我是否需要創建另一個將兩種類型結合在一起的模型類型?

回答

1

我做到這一點的方法如下:

視圖模型:

public class ViewModel 
{ 
    public string Name { get; set; } 
    public List<SelectListItem> ListOfCs { get; set; } 
} 

查看有以下幾點:

<%:Html.EditorFor(model => model, new { ListOfCs = Model.ListOfCs })%> 

我使用默認Object.ascx概述於Brad Wilson's excellent series of blog posts on ASP.NET MVC 2 Templates

然後,添加一個下拉模板爲下拉列表中查看/共享/ EditorTemplates文件夾,並調用它像CClassDropDown:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %> 

<%: Html.DropDownList(null, new List<SelectListItem>(ViewData["ListOfCs"] as List<SelectListItem>), "Select C...")%> 

然後我添加了一個局部的元數據類的p對象:

[MetadataType(typeof(PMetaData))] 
public partial class P 
{ 
    public class PMetaData 
    { 
     [UIHint("CClassDropDown")] 
     [DataType(DataType.Text)] 
     public object C { get; set; } 

    } 
} 

到該類屬性的元數據,所以它知道要使用我指定的模板。

+0

謝謝摩根,我在哪裏添加這個元數據類?以前從未見過! – AndrewC 2011-02-03 20:45:17

0

我只用Linq2Sql做到這一點,所以YMMW。

在Linq2Sql中,實體既有外部實體又有外部實體鍵。

所以,它會有C和C_id。

class P 
{ 
public string Name { get; set; } 
public C OtherData { get; set; } 
public int OtherData_id { get; set; } 
} 

在這種情況下,它只是在做

MyViewData { 
    SelectList CList = new SelectList(ctx.getCs(), "C_id", "C_name") 
} 

,並在頁面的情況下做

<%= Html.DropDownList("OtherData_id", Model.CList,"-") %> 

這樣

TryModelUpdate(...) 

將正確地設置OtherData_id ,這反過來會導致其他數據b e訪問時解析。