首页 文章

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

提问于
浏览
0

我有一个 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 回答

  • 1

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

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

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

  • 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,我们需要在我们的模型项中添加以下行:[7]

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

相关问题