0

该项目目前是 MVC3,但如果需要可以升级。

我正在尝试为一个简单的 cms 改进内容编辑器。目前我们使用

@Html.EditorFor(model=>model.Content) //Content is a List<EditableContent>

EditableContent 具有字符串 EditorView 的(全新)属性。这个想法是这将为特定的内容项目命名合适的编辑器。

如果 EditorView 为空,我想要做的是使用我的默认 EditableContent 模板,否则使用 E​​ditorView 作为命名模板。我知道 EditorFor 的重载需要一个模板,但这将对每个内容项使用相同的模板,但这不是我想要的。

我确实尝试使用我的默认模板,基本上是在做

//Shared/EditorTemplates/EditableContent.cshtml
@model Website.Areas.Admin.EditableContent

@if (!string.IsNullOrWhiteSpace(Model.EditorView))
{
<text>
    @Model.EditorView
    @Html.EditorForModel(Model.EditorView)
</text>
}
else
{
  //Original template
}

奇怪的是,在这种情况下,视图被定位(我有一个稍微自定义的视图引擎,它似乎可以正确定位视图)。视图的名称(通过 @Model.EditorView )被发送到页面,但 @Html.EditorForModel() 不会产生任何东西。

有什么想法可以使用 EditorFor 或类似方法为每个项目使用自定义模板吗?

4

2 回答 2

2

界面

interface IEditableContent
{
    public virtual DatabaseContext.Content Content { get; set; }
}

执行

class SomeTypeEditableContent : IEditableContent
{
    public SomeTypeEditableContent(DatabaseContext.Content c)
    {
        Content = c;
    }
}

服务(存储库或控制器操作)

List<IEditableContent> lEditableContent = new List<IEditableContent>();
foreach(var c in db.Contents)
{
    switch (c.EditorView)
    {
    case "SomeType":
        lEditableContent.Add(new SomeTypeEditableContent(c));
        break;
    default:
        lEditableContent.Add(new DefaultEditableContent(c));
        break;
    }
}

看法

@Html.EditorFor(model=>model.ListContent) //List<IEditableContent>

可编辑的 SomeType 模板

@model SomeTypeEditableContent
//Display this as a editable string

默认可编辑内容模板

@model IEditableContent
//Use default display

对不起,我没有时间测试它。让我知道它是怎么回事,如果没有,我会编辑/删除这个答案。我会将此作为评论发布,但我需要注释和格式化。但至少它让你了解我的想法。

-编辑-

这个示例的重点是向您展示 MVC 框架应该能够为已实现的接口确定正确的模板,即使只是提供类型化为接口的对象也是如此。它将使用refelction(我相信?)来找到最高的类定义,然后寻找模板。

-编辑2(基于评论)-

更改示例以匹配新规范

于 2012-10-01T13:46:11.183 回答
1

您试图从已经覆盖模板的视图中覆盖编辑器模板似乎很奇怪。我不确定这是否可行(可能,但我从未尝试过,所以我不知道)。我已经在上面的问题中添加了一些评论。

如果事实证明尝试从 EditorTemplates 文件夹中指定模板不起作用,这是可以理解的,我认为您可以通过引入自定义EditorForModel()覆盖来实现您想要的。您可以使用 David Ebbo 的 Razor Generator VS 扩展来定义一个可在整个项目中使用的 razor 助手。

/// /Views/Helpers/AndiEditorForExtensions.cshtml
@helper AndiEditorFor(HtmlHelper html, Website.Areas.Admin.EditableContent model) {
    if (!string.IsNullOrWhiteSpace(Model.EditorView)) {
    <text>
        @Model.EditorView
        @Html.EditorForModel(Model.EditorView)
    </text>
    }
    else {
        // Call @Html.EditorFor(), which will use the default editor template (i.e., NOT your custom one defined in the database)
        @Html.EditorFor(model) 
    }
}

然后从从数据库加载 EditableContent 项目并显示它们的正常代码中,调用您的自定义扩展:

@Html.AndiEditorFor(model)

更新:

更好的选择可能是完全跳过 Razor Generator。只需定义一个自定义 HtmlHelper,模仿EditorExtensions 方法。添加类似的 if/else 来处理 Model.EditorView 是否具有值。

于 2012-10-01T13:02:04.687 回答