【问题标题】:reusing view with multiple models in Sitecore MVC using glassmapper使用 glassmapper 在 Sitecore MVC 中重用具有多个模型的视图
【发布时间】:2015-08-27 22:24:15
【问题描述】:

我无法确定如何使用 glassmapper 在我的 sitecore 8 解决方案中重用视图。我有两个包含相同数据的对象,但字段的名称因模板而异。例如,标题与标题。

当页面编辑器不是一个因素时,这相对简单,因为我可以将一个对象映射/投射到另一个对象,但这似乎阻塞了页面编辑器。

最明显的方法是使用接口和扩展方法,如here 所述,但这需要创建一个真正的接口的厨房水槽。

还有其他建议吗?我不想复制视图只是为了更改它使用的属性。

【问题讨论】:

  • 也许您需要重新考虑您的模板,如果数据相同,则分离出一个基本模板,然后使用模板继承。然后,您可以让单个类表示数据。
  • 不反对,但不是真正的选择。问题也更通用,也许一个项目有一个通用链接,而另一个项目链接到它自己

标签: asp.net-mvc sitecore sitecore7 glass-mapper sitecore8


【解决方案1】:

如果您使用的是控制器渲染,那么您可以像这样定义一个接口:

public interface ITitleAndBody : IGlassBase 
{
    string Title  {get; set;}
    string Body  {get; set;}
}

具体类型如下:

public class MyType1 : GlassBase, ITitleAndBody 
{
    [SitecoreField("Title")]
    public virtual int Title  {get; set;}

    [SitecoreField("Body")]
    public virtual string Body  {get; set;}
}

public class MyType2 : MyType1
{
    [SitecoreField("Header")]
    public override int Title  {get; set;}
}

你需要两个控制器动作指向同一个视图:

public ActionResult MyType1()
{
    return PartialView("/Views/MyView.cshtml", SitecoreContext.GetCurrentItem<MyType1>());
}

public ActionResult MyType2()
{
    return PartialView("/Views/MyView.cshtml", SitecoreContext.GetCurrentItem<MyType2>());
}

并且在视图本身中使用接口作为模型:

@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<ITitleAndBody>

<div>@Editable(Model, x => x.Title)</div>
<p>@Editable(Model, x => x.Body)</p>

这是未经测试的代码。当然,使用 View Renderings 会更好。

【讨论】:

    【解决方案2】:

    同意 jammykam 在上面评论中的建议 - 最直接的方法是将模板字段重命名为相同。

    因此,根据您的示例,它们在物理上都将被称为 Title;对于内容编辑器,您可以为特定字段使用帮助显示名称,因此仍然会将它们视为 TitleHeading,尽管事实上它们都被称为系统的 Title .当然,如果您的解决方案可以允许像这样重命名...更多关于这种方法的链接:http://goo.gl/b28s2y(最后一部分)。

    另一个需要考虑的选项 - 您可以考虑在玻璃模型顶部使用代理对象,将您的字段名称重新映射到您想要的任何内容。从而将具有相同名称的代理对象传递给视图。

    但是,你是对的,在最困难的情况下,接口可能是一个答案

    【讨论】:

    • 代理模型听起来像我正在寻找的,但是当我尝试“映射”它时,它会破坏内容编辑器,就好像它正在丢失更新字段所需的信息一样。
    【解决方案3】:

    或者,如果字段相同,您可以在模板的字段属性上更改它们的标题。这样,当我创建模板 X 的项目时,我将看到在模板 X 上分配的字段标题,而字段名称本身保持不变。

    但如果我必须这样做,我更愿意使用带 Glass 的接口。

    【讨论】:

    • 我的意思是 jammykam 评论的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2020-06-29
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多