2014-10-10 143 views
1

我正在尝试开发我们公司需要的NOPCommerce插件。覆盖视图不起作用

我有一些困难让我的控制器和视图覆盖默认的和张贴this SO question。在受访者的善意帮助下,我能够使所有的工作都能够顺利进行。我去了代码的另一个领域,当我回来的时候它并没有完全工作。

我可以让我的控制器覆盖并执行各种配置,现在我理解了与RouteProvider.cs的交互。

然而,我的观点并未受到打击......但他们是因为我有断点,他们正在受到打击。

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

下面是我能想到的彻底破败。

插件文件夹结构:

Project structure


目录输出:

C:\ ... \演示\ Nop.Web \插件\ Payments.StoreCredit \核心\ 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); 
} 

CustomViewEngine:

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一个断点,当我实际上浏览插件,如清单永远只能被击中:

//本地主机:53764 /管理/插件/清单

我已经试过CustomViewEngine newlocation.Insert的众多的变化,但我总有只有六所搜索的路径。我相信我的新地点已被插入,但它们不适用于这种情况,因此不会被搜索到?我这样说是因为如果我重命名编辑。CSHTML核心管理项目刚刚看到的路径搜索,我得到:

控制器使用编辑路径:

本地主机:53764 /管理/订单/编辑/ 1006

回报:

enter image description here

最后,如果我指定的控制器编辑的路径,例如:

return View(“〜/ Plugins/Payments.StoreCredit/Core/Views/Order/edit.cshtml”,model);

我的看法是使用..但是,那么与CustomViewEngine有什么关系呢?

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

+0

对不起,我删除了我的意见意外。但如果它的工作,我会重新发布它:) – Ruslan 2014-10-10 17:00:26

+0

对不起,我正在阅读过程中,当它噗... ...所以你可以转发? :) – GPGVM 2014-10-10 17:01:09

+0

当然。这个想法是在填充newLocations时试用'〜/ Views/Core/{1}/{0} .cshtml'而不是'〜/ Plugin/Payments.StoreCredit/Views/Core/{1}/{0} .cshtml' 。 – Ruslan 2014-10-10 17:01:45

回答

0

不应该这

newLocations.Insert(0, “〜/插件/ Payments.StoreCredit /查看/核心/ {1}/{0} .cshtml”);

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

请注意,在你还没有加入Area = "Admin"参数路线插件

+0

是的,我明白了。我会尝试,但我想我已经尝试过插件的变体 – GPGVM 2014-10-10 17:05:22

+0

不行。编辑器在控制器中返回的URL是localhost:53764/Admin/Order/Edit/1006,与OP中显示的路径相同的六个路径是搜索的内容。 – GPGVM 2014-10-10 17:07:52

0

请注意错字。如果您在GetPath方法中设置断点,您将会看到,如果没有它,您的新位置根本不会被添加。

所有您需要的只是将Area = "Admin"添加到您的路线定义。

0

只要您成功覆盖了Admin/Order/Edit/{id}路由,就不需要对插件中的Controller加载视图的方式做任何特殊处理。

通常,“widget”插件使用视图,因为它们用于显示页面中的信息位。所以你可以看看原始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 ...”开头,因此您可能需要相应更改代码。