2011-02-03 40 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访问时解析。