2008-10-24 102 views

回答

25

這裏是你想要做什麼,首先要定義你的路線圖:

routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "User", action="index", username=""}); 

這是什麼讓你做的是設置以下約定:

  • 控制器:用戶(UserController的類型)
  • 操作:指數(這被映射到UserController中的索引方法)
  • 用戶名:這是用於索引方法
0的參數

所以,當你請求URL http://mydomain.com/javier這將被轉換爲呼籲UserController.Index(用戶名字符串)其中用戶名設置爲哈維爾的價值。

現在既然你打算使用的MembershipProvider類,你要更多的東西是這樣的:

public ActionResult Index(MembershipUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.UserName; 

    return View(); 
} 

爲了做到這一點,你需要使用一個模型綁定器做的工作,好吧,從用戶名綁定到MembershipUser類型。爲此,您需要創建自己的ModelBinder類型並將其應用於Index方法的用戶參數。你的類可以是這個樣子:

public class UserBinder : IModelBinder 
{ 
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) 
    { 
     var request = bindingContext.HttpContext.Request; 
     var username = request["username"]; 
     MembershipUser user = Membership.GetUser(username); 

     return new ModelBinderResult(user); 
    } 
} 

這允許您更改索引方法的聲明是:

public ActionResult Index([ModelBinder(typeof(UserBinder))] 
    MembershipUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.Username; 
    return View(); 
} 

正如你可以看到,我們已經應用了[ModelBinder的( typeof(UserBinder))]屬性的方法的參數。這意味着在你的方法被調用之前,你的方法被調用的時候,你的類型將被調用,你將擁有一個你的MembershipUser類型的有效實例。

1

你可以有一個看起來路線,如:

{username} 

Controller = "Users" 

的默認值的成品:

routes.MapRoute(
        "Users", 
        "{username}", 
        new { controller = "Users" } 

從而使用戶名是隻有url參數,MVC假定它將它傳遞給用戶控制器。

+0

好吧,我有這個......但它不工作的原因。我該如何處理View? – 2008-10-24 20:31:35

+0

我會假設他們都會有相同的看法。只要您調用View(字符串)重載並且View的aspx位於Views下的Users子目錄中,就可以調用您的視圖。 – 2008-10-24 20:39:08

+0

您還必須指定操作。 將新部分更改爲:new {controller =「Users」,action =「Show」} 或任何你想命名它 – 2008-10-24 20:40:25

1

您是否試圖將它作爲參數傳遞給Controller?

理論上你可以做這樣的事情:

routes.MapRoute( 「名」, 「{用戶}/{控制器}/{行動}」,新{控制器= 「嗒嗒」,行動=「嗒嗒「,user =」「})

我對ASP.NET路由沒有太多經驗,但我認爲應該的工作。

1
routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "Users", action="ShowUser", username=""}); 

好了,這是什麼會做的是默認的用戶名參數{用戶名}

所以即使你寫的用戶名的值=「」它會知道通過價值{用戶名} ..憑藉字符串匹配。

這會期望

爲URL形式

http://website.com/username

  • 用戶位指示
  • ShowUser動作(在控制器的方法)在ShowUser動作
  • 用戶名參數(方法)
17

你可能想,如果你想有一些其他功能的控制器一樣帳戶,管理員,配置文件,設置等,你可能還需要您的靜態內容不觸發「用戶名」考慮不允許某些類型的用戶名路線。爲了達到那樣的功能(類似於如何Twitter的網址進行處理),你可以使用以下路線:

// do not route the following 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("content/{*pathInfo}"); 
routes.IgnoreRoute("images/{*pathInfo}"); 

// route the following based on the controller constraints 
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    , new { controller = @"(admin|help|profile|settings)" } // Constraints 
); 

// this will catch the remaining allowed usernames 
routes.MapRoute(
    "Users", 
    "{username}", 
    new { controller = "Users", action = "View", username = "" } 
); 

然後,你將需要爲每個約束串令牌的控制器(例如,管理員,幫助,配置文件,設置),以及一個名爲用戶的控制器,當然也是本例中Home的默認控制器。

如果您有許多不想允許的用戶名,那麼您可以通過創建自定義路由處理程序來考慮更動態的方法。