MVC 3不呈现对象的编辑器模板

时间:2011-03-28 15:09:00

标签: asp.net-mvc-3

我有一个MVC 3应用程序,它允许用户显示和编辑不同类型的值。执行此操作的视图并不一定知道值的类型(它被声明为对象),但我希望它能够呈现正确的编辑器模板。现在我有这个:

<%: Html.EditorFor(n => attribute.ValueTyped) %>

attribute.ValueTyped属于object类型。当ValueTyped的类型为bool时,MVC会呈现一个复选框(这是它应该做的)。但是,只要ValueTyped属于不同的类型(到目前为止我尝试过int,double,string),MVC根本不会渲染任何东西。

如何让MVC渲染int,double,string或我的ValueTyped包含的任何类型的通用模板?请注意:我不想自己生成文本框,但我宁愿让MVC决定使用哪个编辑器模板。

2 个答案:

答案 0 :(得分:1)

在设置MVC 3应用程序时,应该允许下拉列表选择项目的外键不会呈现为下拉列表,而是呈现为静态输入。这可以通过为该字段创建自定义显示和视图来解决。 我们需要首先创建一个自定义的局部视图,它将存在于“〜/ Views / Shared / DisplayTemplates / UserGuid.cshtml”和“〜/ Views / Shared / EditTemplates / UserGuid.cshtml”中。一个代码位于以下位置:

@model Guid

@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
    incMvcSite.Models.SecUser usr = db.SecUsers.Single(u => u.Guid == Model);
}
@usr.Display

这是模板的显示,它将在引用的表中查找项目并显示它。我们还需要对模板进行编辑,如下所示:

@model Guid
@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
    SelectList items = new SelectList(db.SecUsers.OrderBy(i => i.Display).ToList(), "Guid", "Display", Model);
}
@Html.DropDownList("", items)

模板编辑实现为下拉列表。最初,我们使用了静态HTML代码,但问题出现了实现“前缀”。静态HTML代码确实由HTML帮助程序处理,因此建议您使用HTML.DropDownList()。 要强制MVC框架使用新的Display和Edit for templates,我们需要在我们的模型项中添加以下行: [UIHint( “UserGuid”)]

这将导致MVC使用名为“UserGuid”的显示和编辑模板,这些模板只是部分视图。

答案 1 :(得分:1)

您可以尝试通过将其作为第二个参数传递来显式传递编辑器模板的名称。根据您的动态情况,这可能如下所示:

<%: Html.EditorFor(m => attr.ValueTyped, attr.ValueTyped.GetType().Name) %>

当然,你的问题很老 - 也许你可以用你找到的答案更新它?