我想創建一個用戶名的路線......ASP.Net MVC路由到用戶名
所以URL將mydomain.com/abrudtkhul(abrudtkhul作爲用戶名)
我的申請將有基於用戶名的公開個人資料(例如:http://delicious.com/abrudtkuhl)。我想複製這個URL方案。
我該如何在ASP.Net MVC中構造它?我也使用會員/角色提供商。
我想創建一個用戶名的路線......ASP.Net MVC路由到用戶名
所以URL將mydomain.com/abrudtkhul(abrudtkhul作爲用戶名)
我的申請將有基於用戶名的公開個人資料(例如:http://delicious.com/abrudtkuhl)。我想複製這個URL方案。
我該如何在ASP.Net MVC中構造它?我也使用會員/角色提供商。
這裏是你想要做什麼,首先要定義你的路線圖:
routes.MapRoute(
"Users",
"{username}",
new { controller = "User", action="index", username=""});
這是什麼讓你做的是設置以下約定:
所以,當你請求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類型的有效實例。
你可以有一個看起來路線,如:
{username}
與
Controller = "Users"
的默認值的成品:
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users" }
從而使用戶名是隻有url參數,MVC假定它將它傳遞給用戶控制器。
您是否試圖將它作爲參數傳遞給Controller?
理論上你可以做這樣的事情:
routes.MapRoute( 「名」, 「{用戶}/{控制器}/{行動}」,新{控制器= 「嗒嗒」,行動=「嗒嗒「,user =」「})
我對ASP.NET路由沒有太多經驗,但我認爲應該的工作。
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users", action="ShowUser", username=""});
好了,這是什麼會做的是默認的用戶名參數{用戶名}
所以即使你寫的用戶名的值=「」它會知道通過價值{用戶名} ..憑藉字符串匹配。
這會期望
爲URL形式
你可能想,如果你想有一些其他功能的控制器一樣帳戶,管理員,配置文件,設置等,你可能還需要您的靜態內容不觸發「用戶名」考慮不允許某些類型的用戶名路線。爲了達到那樣的功能(類似於如何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的默認控制器。
如果您有許多不想允許的用戶名,那麼您可以通過創建自定義路由處理程序來考慮更動態的方法。
好吧,我有這個......但它不工作的原因。我該如何處理View? – 2008-10-24 20:31:35
我會假設他們都會有相同的看法。只要您調用View(字符串)重載並且View的aspx位於Views下的Users子目錄中,就可以調用您的視圖。 – 2008-10-24 20:39:08
您還必須指定操作。 將新部分更改爲:new {controller =「Users」,action =「Show」} 或任何你想命名它 – 2008-10-24 20:40:25