2014-10-10 103 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 ...」開頭,因此您可能需要相應更改代碼。