覆盖视图无效

时间:2014-10-10 16:50:25

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

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

我在控制器和视图中覆盖默认值并发布this SO question时遇到了一些困难。在受访者的亲切帮助下,我能够让一切顺利。我去了代码的另一个区域工作,当我回来时,它没有完全正常工作。

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

然而,我的观点并没有被击中......但是他们就像我有断点而被击中了。

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

这是我能想到的彻底破解。

插件文件夹结构:

Project structure


目录输出:

  

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

返回:

enter image description here

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

  

返回视图("〜/ Plugins / Payments.StoreCredit / Core / Views / Order / edit.cshtml",model);

我的观点已被使用..但那么与CustomViewEngine相关的是什么呢?

换句话说,我可以一起指定控制器中的路径,但CustomViewEngine是更健壮,更专业的方式。

3 个答案:

答案 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 ..."开头。所以你可能需要在你的代码中相应地改变它。