我正在尝试开发我们公司对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);
}
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的 NUMEROUS 变体,但我总是只搜索了六条路径。我相信我的新位置已插入,但它们不适用"适用"在这种情况下,他们不会被搜查?我这样说是因为如果我重命名核心管理项目中的edit.cshtml只是为了看到我搜索到的路径:
控制器中编辑使用的路径:
本地主机:53764 /管理/订购/编辑/ 1006
返回:
最后,如果我在控制器编辑中指定路径,例如:
返回视图("〜/ Plugins / Payments.StoreCredit / Core / Views / Order / edit.cshtml",model);
我的观点已被使用..但那么与CustomViewEngine相关的是什么呢?
换句话说,我可以一起指定控制器中的路径,但CustomViewEngine是更健壮,更专业的方式。
答案 0 :(得分:0)
不应该
newLocations.Insert(0, "〜/插件/ Payments.StoreCredit /查看/核心/ {1} / {0} .cshtml&#34);
是
newLocations.Insert(0, "~/Plugins/Payments.StoreCredit/Views/Core/{1}/{0}.cshtml");
注意插件中的拼写错误
答案 1 :(得分:0)
请注意,您尚未在路线中添加Area = "Admin"
参数。如果在GetPath方法中设置断点,您将看到,如果没有它,则根本不会添加新位置。
您只需要在路线定义中添加Area = "Admin"
。
答案 2 :(得分:0)
只要您已成功覆盖Admin/Order/Edit/{id}
路由,就无需对插件中的Controller加载View的方式做任何特殊处理。
通常,"小部件"插件使用视图,因为它们用于在页面中显示信息。因此,您可以查看原始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"通过" [...] ViewEngine"解决来自Nop.Web.Framework.Themes
命名空间的类。
因此,您可以看到无需使用CustomViewEngine
。
另请注意,您的插件名称以" Company.Plugin ..."开头。所以你可能需要在你的代码中相应地改变它。