来自不同实体的MVC下拉列表

时间:2011-02-03 20:01:49

标签: c# model-view-controller asp.net-mvc-2

我有一个观点,即继承自System.Web.Mvc.ViewPage<P>

类型P具有类型C的属性,即P可以是:

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

有问题的视图用于创建新的P,因此我想创建一个包含所有可用C的DropDown列表。

所以下拉列表可能是:

  • C1
  • C2
  • C3
  • C4

我尝试在我的控制器中为List<SelectListItem>创建C对象,然后使用ViewData将它们传递给视图,但这不起作用,就像我尝试的那样提交我得到例外:

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

所以我的问题是,如何创建一个C对象列表,以便在我的View中显示继承自P类型的对象。从数据库中提取对象列表,因此我不能简单地将选项硬编码到视图中。

我是否需要创建另一种将这两种类型结合在一起的模型类型?

2 个答案:

答案 0 :(得分:1)

我这样做的方式如下:

<强>视图模型:

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

我的查看包含以下内容:

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

我使用Brad Wilson's excellent series of blog posts on ASP.NET MVC 2 Templates

中列出的默认Object.ascx

然后我在Views / Shared / 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; }

    }
}

到该类属性的元数据,以便它知道使用我指定的模板。

答案 1 :(得分: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,这将导致在访问时解析OtherData。