2017-10-12 158 views
1

爲了阻止我的應用程序混亂,我開始使用區域。但現在我總是要撥打:中
http://localhost:49358/Document/Document/
代替:
http://localhost:49358/Document/
我怎樣才能改變我的路線由區名訪問控制器? (沒有的HomeController)路由與區域和控制器名稱(asp.net核心)

我有我的項目內的以下文件夾結構:

Folderstructure inside my Project
我到地區航線的代碼看起來是這樣的:

routes.MapRoute(name: "areaRoute",template: "{area:exists}/{controller=Home}/{action=Index}"); 

而且我把[我的DocumentController中的區域(「Document」)]標記。

編輯:
作爲建議的Shyju和傑米·泰勒我與HomeControllers去了。 (謝謝兩位的快速解答和解釋)

我的結構現在看起來這和路由工作像預期:
enter image description here

對我來說還是有點dissapointing有這麼多HomeControllers和索引文件。導航代碼是不那麼容易了:
enter image description here

EDIT2:
掌握所有這些Homecontrollers太惱火後,我去與傑米·泰勒提出的解決方案和rearanged在特點夾中的一切。它需要更多的配置,但在我看來更清潔。
它也進一步在此Microsoft文章解釋(只是跳過區域的東西):
https://msdn.microsoft.com/en-us/magazine/mt763233.aspx

我的結構,現在看起來像這樣和路由的工作原理就像一個魅力和控制器的名稱還是有意義的:
enter image description here

+0

我不確定那是哪個區域。也許你應該重新考慮你的架構。也許您可以在文檔區域下添加一個剃鬚刀頁面,該頁面的作用類似於索引頁面,並提供文檔索引視圖的所有功能 –

+0

「區域是一種ASP.NET MVC功能,用於將相關功能組織爲一個獨立的命名空間(用於路由)和文件夾結構(用於視圖)「聽起來讓人滿意。你會推薦什麼? – Yush0

+0

在編輯完成之前,您已經到達了那裏:P –

回答

1

我不確定那是哪個區域的用途。也許你應該重新考慮你的架構。

在我的ASP.NET MVC Core application template中,我使用了功能文件夾,它有點像區域。

要做到這一點,我已經添加了以下到ConfigureServices方法:

serviceCollection.Configure<RazorViewEngineOptions>(options => 
{ 
    options.ViewLocationExpanders.Add(new FeatureLocationExpander()); 
}); 

其中FeatureLocationExpander是:

public class FeatureLocationExpander : IViewLocationExpander 
{ 
    public void PopulateValues(ViewLocationExpanderContext context) 
    { 
    // Don't need anything here, but required by the interface 
    } 

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) 
    { 
    // The old locations are /Views/{1}/{0}.cshtml and /Views/Shared/{0}.cshtml 
    // where {1} is the controller and {0} is the name of the View 

    // Replace /Views with /Features 
    return new string[] 
    { 
     "/Api/{1}/{0}.cshtml", 
     "/Features/{1}/{0}.cshtml", 
     "/Features/Shared/{0}.cshtml" 
    }; 
    } 
} 

更換新的String []這是由返回的內容您的區域的ExpandViewLocations將意味着您不必添加路由屬性。

但是,這並沒有解決您的問題,因爲這不是什麼區域。

除非您在Documents區域下添加了一個剃鬚刀頁面(名爲Index.cshtml),該區域充當「文檔」區域的索引頁面。這個Index.cshtml可以在你的/Documents/Documents/Index.cshtml中提供Index.cshtml的所有功能,還有一個類似文件的代碼隱藏功能(記得ASP.NET webforms? 。

+0

花了我一些手腳,但這是我正在尋找和乾淨的方式。你的例子和這篇文章幫助我得到它: https://msdn.microsoft.com/en-us/magazine/mt763233.aspx – Yush0

+0

我很高興我能幫上忙。 –

2

區域的默認路由註冊使用HomeController作爲url中控制器的默認值。如果您希望DocumentController成爲默認值,請在StatrtUp類中更新它。

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "areas", 
     template: "{area:exists}/{controller=Document}/{action=Index}/{id?}" 
    ); 
}); 

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 

}); 

記住該註冊代碼是所有現有的區域(因爲我們在網址模板{area:exists}),不僅僅是文檔區域。這意味着,無論何時請求出現yourApp\someAreaName,框架都會將請求發送到DocumentController的索引操作someAreaName

您已將與文檔相關的代碼組織到文檔區域。現在爲什麼你需要你的控制器名稱是文檔?我覺得,這是重複的。

我個人將文檔區域內的DocumentController重命名爲HomeController,並使用區域註冊的默認路由註冊碼(它使用HomeController作爲url模板中的默認控制器值)。這樣,它將適用於您未來的領域,並且您的代碼看起來更乾淨。 恕我直言,在任何地區的HomeController是有意義的,在任何地區的DocumentController會混淆。

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "areas", 
     template: "{area:exists}/{controller=Home}/{action=Index}/{id?}" 
    ); 
}); 
+0

非常感謝您的回覆。我也偶然發現了這種方法。但是這意味着對於每個新的「模塊」,startup.cs中都會有一個新條目。我試圖實現類似於: {area:exists}/{controller = }/{action = Index}/{id?} – Yush0

+0

是的。這就是爲什麼我建議將您的控制器從Document重命名爲Home(您已將代碼組織到Document區域,爲什麼現在在控制器中重複名稱?)並使用默認(通用)註冊碼,該代碼適用於您創建的所有新區域在未來。 – Shyju

相關問題