2009-09-11 63 views
7

我還在學習ASP.NET MVC。有了webforms,我會創建一個新的文件夾,我們稱之爲admin。在那裏,我可能會有許多頁面供create_product,edit_product等使用,因此URL可能看起來像http://somesite.com/admin/create_product.aspxASP.NET MVC視圖或URL應該有多少層次?

但與MVC它有點不同。我正試圖看看最好的辦法是做什麼。

會做http://somesite.com/admin/product/create是對的嗎?或者它應該只是http://somesite.com/product/create?如果我以第一種方式進行操作,是否將所有內容都放在「管理員」控制器中,還是應該將其分解爲「產品」控制器?

我知道這可能是主觀或個人選擇,但我想得到一些建議。

謝謝。

回答

11

ASP.NET MVC的好處之一(更一般地說,.NET 3.5 SP1中所有ASP.NET通用的URL路徑引擎)都是可以靈活配置URL的映射到您喜歡的任何文件夾/文件結構。這意味着它比WebForms在開始構建項目之後修改網址的日子要容易得多。

爲了您的具體問題:

  • 一個管理控制器與產品控制器 - 一般情況下,指導是保持控制器集中,使他們更容易測試和維護。出於這個原因,我建議使用CRUD操作的每個對象類型(如Product)使用單個控制器。

    /管理/產品/創建

    /管理/產品/編輯/ 34或/管理/產品/編輯/紅鞋子(如果名是唯一的)

    :在你的案例在任何一種情況下,創建,編輯,Deatils操作都將位於ProductController中。您可能只有「管理員操作」(如「創建」和「編輯」)的自定義路由,以限制其使用(並將「管理員」文本添加到網址),然後詳細信息操作可供所有訪問者使用。

  • 保護管理視圖 - 使用MVC記住的一個重要事實是:所有請求都直接轉到控制器,而不是視圖。這意味着舊的「使用web.config保護目錄」不適用於(通常)MVC以保護您的管理員。相反,您現在應該直接將安全性應用於控制器。限於特定的用戶角色 -
    • [授權] - 只需檢查該用戶登錄
    • [授權(角色=「管理員」)]:這可以容易地通過使用屬性到控制器類等實現
    • [授權(用戶=「喬」)] - 限制對特定用戶

你甚至可以創建「管理」,在您的網站,並限制訪問這些觀點通過實施意見自定義路線您的授權檢查URL路由,如下所示:

routes.MapRoute(
    "Admin", 
    "Admin/{controller}/{action}", 
    new { controller = "Product", action = "Index" }, 
    new { authenticated= new AuthenticatedConstraint()} 
); 

凡AuthenticatedConstraint看起來像:斯蒂芬·瓦爾特博客

using System.Web; 
using System.Web.Routing; 
public class AuthenticatedConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
    return httpContext.Request.IsAuthenticated; 
    } 
} 

好細節: ASP.NET MVC Tip #30 – Create Custom Route Constraints

1

對於管理員的東西,只需標記[Authorize]屬性。爲確保只有管理員可以使用它,請執行類似[Authorize(Roles = "Admin")]的操作。退房 this question

此外,/產品/創建是最常見的,我覺得:)

+0

Thansks,我不是授權用戶的點。我只想看看我應該如何形成我的網址。或者做一些很好的建議。 :) – vincentw56 2009-09-11 17:04:11

1

I3Dx絕對有對授權屬性的正確引導,這是保持控制器的安全至關重要,你可以申請到一個控制器或個人行爲。

至於URL深度,我就不會擔心的深度,我會更關注的是,路線由例如邏輯意義:

domain.com/admin/products/edit/1

domain.com/admin/groups/edit/1

domain.com/products/view/1

domain.com/groups/view/1

你知道W本辦法每條路線都會發生一次帽子。很明顯,一個是管理員,一個是最終用戶。

最簡單的檢查方法是讓某人閱讀您的網址並詢問他們期望看到的內容。

希望這會有所幫助。

OH和最後一件事情,對於客戶端路線,我們經常使用「slugs」而不是id,以便它更具可讀性。因此,當有人創建了一個產品,我們slugify名稱,以便它可以在航線使用,如:

domain.com/products/view/big-red-bucket

而不是

域。 com/products/view/1