视图引擎如何在MVC中为不同路径的相同视图页面工作?

时间:2016-02-05 05:44:35

标签: asp.net-mvc nopcommerce

我创建了两个插件,例如CustomPlugin&为myplugin。这两个插件都有同名的页面。例如xyz.cshtml。但有不同的模型。例如,CustomPlugin的xyz.cshtml及其模型,MyPlugin的xyz.cshtml有自己的模型。我在这两个插件中都使用View引擎。我在两个插件中都在0索引上注册了View Engine。

我想知道哪个插件首先调用该视图页面?如果它有两个0索引路径,View Engine如何工作?是否有任何方法可以首先使它成为第一个?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我认为您的问题不在于视图,而在于控制器。通常,MVC通过控制器而不是视图进行路由。这意味着每个插件的RouteProvider.cs中的路由都定义了首先执行哪个Contoller / View。 如果使用行检查类的按钮,则默认路由在Presentation \ Nop.Web \ Infrastructure \ RouteProvider.cs类中具有优先级0

public int Priority
    {
        get
        {
            return 0;
        }
    }

您应该在插件中定义相同的routeprovider.cs并将其设置为优先级高于0.如果您希望首先执行,则分别设置高于其他插件的其他插件。然后在每个routeproider内部为您的自定义视图引擎发出一个调用/插入,如下所示。

    public void RegisterRoutes(RouteCollection routes)            {

                    System.Web.Mvc.ViewEngines.Engines.Insert(0,new CustomViewEngine());

  // your routes for your plugin here

}

它为ViewEngine添加了额外的位置以搜索视图,并确保首先在其内部查看自己的View目录,方法是插入位置0.因此,这两个后来称为“routeprovider.cs”的插件将在第一个位置。这意味着降低路由提供优先级具有更高的视图位置(或优先级) 但这里可能存在问题。由于您具有相同的命名视图。我相信你会遇到问题,因为你不能管理2个插件(控制器)动态找到2个不同的视图,除非你在控制器中硬编码路由。因为ViewEngine注册将搜索所有已注册的视图,它将首先路由它找到的视图。

  

如果客户希望在其主题中使用插件的视图页

,该怎么办?

我在这里看不到任何问题。因为插件的目的是覆盖默认控制器,视图或添加其他功能。因此,正如我上面所写,插件的RouteProviders中的优先级应该更高。请参阅每个插件的configure.cshtml和相关配置操作。这就是他们的工作方式。每个插件都有相同的configure.cshtml,它将被称为返回视图(“〜/ Plugins / DiscountRules.CustomerRoles / Views / DiscountRulesCustomerRoles / Configure.cshtml”,model);例如

更新:多个主题是插件的难题,因为插件通常会覆盖所有可用主题,包括默认值,如果位置插入为0,如上所述。如果你要覆盖整个视图,你可以使用System.Web.Mvc.ViewEngines.Engines.Add,这将确保主题视图获胜,如果它存在且应该使用插件视图,它们不应该具有相同的主题下的命名视图。例如,

  • PLugin - abc.cshtml
  • 主题1- abc.cshtml
  • 主题2 - 没有abc.cshtml

在这种情况下,主题1使用它是自己的,主题2使用来自插件。 但是这种情况仅在模型相同时才有效,因为您无法使控制器对同一路线可选。

如果要覆盖视图中的部分视图或某些html,则可以使用widget + api插件。 widget生成路由,api插件实现该路由。

我希望这会有所帮助。