【问题标题】:Override views are not working覆盖视图不起作用
【发布时间】:2014-10-10 16:50:25
【问题描述】:

我正在尝试为 NOPCommerce 开发我们公司需要的插件。

我很难让我的控制器和视图覆盖默认值并发布this SO question。在受访者的善意帮助下,我能够让一切正常进行。我去处理代码的另一个领域,但当我回来时,它并没有完全工作。

既然我了解了与 RouteProvider.cs 的交互,我可以让我的控制器以各种配置方式覆盖和执行。

然而,我的观点并没有受到打击......但它们就像我有断点一样受到打击。

我知道 MVC 有一个模式/语法期望,如果你不在这些范围内玩,事情就不会起作用,我相信这就是正在发生的事情。我的问题是我不明白游戏规则之一。

这是我能想到的最详尽的纲要。

插件文件夹结构:


目录输出:

C:\ ...\Presentation\Nop.Web\Plugins\Payments.StoreCredit\Core\Views\Order


我的控制器...被击中...和路由提供者条目:

var OverrideRoute = routes.MapRoute("Plugin....OrderOverride", "Admin/Order/Edit/{id}",
                 new { controller = "Order", action = "Edit" },
                 new { id = @"\d+" },
                 new[] { "Company.Plugin.Payments.StoreCredit.Core.Controllers" }
            );

            routes.Remove(OverrideRoute); //remove route 
            routes.Insert(0, OverrideRoute); //add it back to the top

public ActionResult Edit(int id)
{
  ....again just to be clear controller is being hit...
  return View(model);
}

自定义视图引擎:

protected override string GetPath(...parms) 
{
  ...
  //custom View locations to the top of the list to be given a higher precedence
  newLocations.Insert(0, "~/Plugin/Payments.StoreCredit/Views/Core/{1}/{0}.cshtml");
  ....
}

一些我注意到但无法拼凑起来的东西

如果我在 CustomViewEngine 上设置断点,它只会在我实际浏览插件列表时被命中,例如:

//localhost:53764/Admin/Plugin/List

我已经尝试了 NUMEROUS 个 CustomViewEngine newlocation.Insert 变体,但我总是只搜索六个路径。我相信我的新位置已插入,但它们不适用于此上下文,因此不会被搜索?我这样说是因为如果我在核心管理项目中重命名 edit.cshtml 只是为了查看搜索到的路径:

控制器中edit使用的路径:

localhost:53764/Admin/Order/Edit/1006

返回:

最后,如果我在控制器编辑中指定一个路径,例如:

return View("~/Plugins/Payments.StoreCredit/Core/Views/Order/edit.cshtml", model);

我的视图被使用了..但是对 CustomViewEngine 大惊小怪的意义何在?

换句话说,我可以将它们组合在一起,在控制器中指定路径,但 CustomViewEngine 是更强大和更专业的方法。

【问题讨论】:

  • 对不起,我不小心删除了我的评论。但如果它有效,我会重新发布它:)
  • 对不起,我正在阅读时,它变得噗噗......所以你能重新发布吗? :)
  • 当然。这个想法是在填充新位置时尝试~/Views/Core/{1}/{0}.cshtml 而不是~/Plugin/Payments.StoreCredit/Views/Core/{1}/{0}.cshtml
  • 不使用相同的 6 个路径和插件路径。

标签: asp.net-mvc asp.net-mvc-4 nopcommerce razor-2


【解决方案1】:

不应该这样

newLocations.Insert(0, "~/Plugin/Payments.StoreCredit/Views/Core/{1}/{0}.cshtml");

成为

newLocations.Insert(0, "~/Plugins/Payments.StoreCredit/Views/Core/{1}/{0}.cshtml");

注意插件中的拼写错误

【讨论】:

  • 是的,我明白了。我现在会尝试,但我想我已经尝试过插件的变体
  • 不行。控制器中编辑返回的 url 是 localhost:53764/Admin/Order/Edit/1006 和 OP 中显示的相同的六个路径是搜索的内容。
【解决方案2】:

请注意,您尚未将Area = "Admin" 参数添加到您的路线中。如果您在 GetPath 方法中设置断点,您将看到,没有它,您的新位置根本不会被添加。

您只需将Area = "Admin" 添加到您的路由定义中。

【讨论】:

    【解决方案3】:

    只要你成功覆盖了Admin/Order/Edit/{id} 路由,就不需要对插件内的控制器加载视图的方式做任何特别的事情。

    通常,“小部件”插件使用视图,因为它们用于在页面中显示信息位。因此,您可以从原始 NopCommerce 代码中查看这些插件,了解它们是如何实现的。

    我以 NopCommerce 团队完成的小部件为例,通过将它们放置在插件的项目树中,我一直成功地加载插件视图:

    Nop.Plugin.Widgets.FooBar
    |- ...
    |- Views
       |- WidgetsFooBar
          |- Configure.cshtml
          |- PublicInfo.cshtml
    

    并像这样在控制器中调用它们:

    return View("Nop.Plugin.Widgets.FooBar.Views.WidgetsFooBar.Configure", model);
    

    请注意,对 View 方法的调用接受“viewName”。此“viewName”由 Nop.Web.Framework.Themes 命名空间中的“[...]ViewEngine”类解析。

    如您所见,无需使用CustomViewEngine

    另请注意,您的插件名称以“Company.Plugin...”开头,因此您可能需要在代码中进行相应更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多