我有一个观点,即继承自System.Web.Mvc.ViewPage<P>
。
类型P具有类型C
的属性,即P
可以是:
class P
{
public string Name { get; set; }
public C OtherData { get; set; }
}
有问题的视图用于创建新的P
,因此我想创建一个包含所有可用C
的DropDown列表。
所以下拉列表可能是:
我尝试在我的控制器中为List<SelectListItem>
创建C
对象,然后使用ViewData
将它们传递给视图,但这不起作用,就像我尝试的那样提交我得到例外:
System.InvalidOperationException: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key C.
所以我的问题是,如何创建一个C
对象列表,以便在我的View中显示继承自P
类型的对象。从数据库中提取对象列表,因此我不能简单地将选项硬编码到视图中。
我是否需要创建另一种将这两种类型结合在一起的模型类型?
答案 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。