AKTUALIZACJA : To zostało opublikowane na codeplex . Kompletny kod źródłowy, a także wstępnie skompilowany zestaw są dostępne do pobrania. Nie miałem jeszcze czasu na umieszczenie dokumentacji na stronie, więc ten wpis SO na razie wystarczy.
AKTUALIZACJA : Dodałem kilka nowych atrybutów do obsługi 1) kolejności tras, 2) ograniczeń parametrów trasy i 3) wartości domyślnych parametrów trasy. Poniższy tekst odzwierciedla tę aktualizację.
Właściwie zrobiłem coś takiego dla moich projektów MVC (nie mam pojęcia, jak Jeff to robi przy użyciu stackoverflow). Zdefiniowałem zestaw atrybutów niestandardowych: UrlRoute, UrlRouteParameterConstraint, UrlRouteParameterDefault. Mogą być dołączane do metod akcji kontrolera MVC, aby automatycznie wiązać z nimi trasy, ograniczenia i wartości domyślne.
Przykładowe użycie:
(Zwróć uwagę, że ten przykład jest nieco wymyślony, ale demonstruje tę funkcję)
public class UsersController : Controller
{
[UrlRoute(Path = "users")]
public ActionResult Index()
{
return View();
}
[UrlRoute(Path = "users/{userId}")]
[UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
public ActionResult UserProfile(int userId)
{
return View();
}
[UrlRoute(Path = "users/admin", Order = -10)]
public ActionResult AdminProfile()
{
return View();
}
[UrlRoute(Path = "users/{userId}/posts/{dateRange}")]
[UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
[UrlRouteParameterDefault(Name = "dateRange", Value = "all")]
public ActionResult UserPostsByTag(int userId, string dateRange)
{
return View();
}
Definicja UrlRouteAttribute:
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteAttribute : Attribute
{
public string Name { get; set; }
public string Path { get; set; }
public int Order { get; set; }
}
Definicja UrlRouteParameterConstraintAttribute:
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterConstraintAttribute : Attribute
{
public string Name { get; set; }
public string Regex { get; set; }
}
Definicja UrlRouteParameterDefaultAttribute:
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterDefaultAttribute : Attribute
{
public string Name { get; set; }
public object Value { get; set; }
}
Zmiany w Global.asax.cs:
Zamień wywołania MapRoute za pomocą pojedynczego wywołania funkcji RouteUtility.RegisterUrlRoutesFromAttributes:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteUtility.RegisterUrlRoutesFromAttributes(routes);
}
Definicja RouteUtility.RegisterUrlRoutesFromAttributes:
Pełne źródło jest dostępne w Codeplex . Przejdź do tej witryny, jeśli masz jakieś uwagi lub raporty o błędach.
Możesz także wypróbować AttributeRouting , który jest dostępny z github lub za pośrednictwem nuget .
To bezwstydna wtyczka, bo jestem autorem projektu. Ale dang, jeśli nie jestem zadowolony z jego używania. Ty też możesz być. W wiki repozytorium github znajduje się mnóstwo dokumentacji i przykładowego kodu .
Dzięki tej bibliotece możesz wiele zrobić:
Jestem pewien, że zapominam o innych rzeczach. Sprawdź to. Instalacja przez nuget jest bezbolesna.
UWAGA: Od 16.04.12 AttributeRouting obsługuje również nową infrastrukturę interfejsu API sieci Web. Na wypadek, gdybyś szukał czegoś, co sobie z tym poradzi. Dzięki subkamran !
źródło
1. Pobierz plik RiaLibrary.Web.dll i odwołaj się do niego w projekcie witryny ASP.NET MVC
2. Zdekoruj metody kontrolera za pomocą atrybutów [Url]:
public SiteController : Controller { [Url("")] public ActionResult Home() { return View(); } [Url("about")] public ActionResult AboutUs() { return View(); } [Url("store/{?category}")] public ActionResult Products(string category = null) { return View(); } }
BTW, „?” Zaloguj się Parametr „{? category}” oznacza, że jest opcjonalny. Nie musisz określać tego jawnie w domyślnych ustawieniach trasy, co jest równe temu:
routes.MapRoute("Store", "store/{category}", new { controller = "Store", action = "Home", category = UrlParameter.Optional });
3. Zaktualizuj plik Global.asax.cs
public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoutes(); // This does the trick } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } }
Jak ustawić wartości domyślne i ograniczenia? Przykład:
public SiteController : Controller { [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")] public ActionResult ArticlesEdit(int id) { return View(); } [Url("articles/{category}/{date}_{title}", Constraints = "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")] public ActionResult Article(string category, DateTime date, string title) { return View(); } }
Jak ustawić zamówienie? Przykład:
[Url("forums/{?category}", Order = 2)] public ActionResult Threads(string category) { return View(); } [Url("forums/new", Order = 1)] public ActionResult NewThread() { return View(); }
źródło
{?param}
nazewnictwo parametrów opcjonalnych.Ten post ma na celu jedynie rozszerzenie odpowiedzi DSO.
Konwertując moje trasy na atrybuty, musiałem obsłużyć atrybut ActionName. Więc w GetRouteParamsFromAttribute:
ActionNameAttribute anAttr = methodInfo.GetCustomAttributes(typeof(ActionNameAttribute), false) .Cast<ActionNameAttribute>() .SingleOrDefault(); // Add to list of routes. routeParams.Add(new MapRouteParams() { RouteName = routeAttrib.Name, Path = routeAttrib.Path, ControllerName = controllerName, ActionName = (anAttr != null ? anAttr.Name : methodInfo.Name), Order = routeAttrib.Order, Constraints = GetConstraints(methodInfo), Defaults = GetDefaults(methodInfo), });
Również nazwa trasy nie była odpowiednia. Nazwa jest budowana dynamicznie za pomocą controllerName.RouteName. Ale moje nazwy tras są ciągami znaków stałych w klasie kontrolera i używam ich również do wywoływania Url.RouteUrl. Dlatego naprawdę potrzebuję, aby nazwa trasy w atrybucie była rzeczywistą nazwą trasy.
Inną rzeczą, którą zrobię, jest przekonwertowanie atrybutów default i constraint na AttributeTargets.Parameter, aby móc je przypisać do parametrów.
źródło
Połączyłem te dwa podejścia w wersji Frankensteina dla każdego, kto tego chce. (Podobał mi się opcjonalny zapis parametrów, ale pomyślałem, że powinny one być oddzielnymi atrybutami od domyślnych / ograniczeń, a nie wszystkie zmieszane w jeden).
http://github.com/djMax/AlienForce/tree/master/Utilities/Web/
źródło
Musiałem uzyskać routing ITCloud działający w asp.net mvc 2 przy użyciu AsyncController - aby to zrobić, po prostu edytuj klasę RouteUtility.cs w kodzie źródłowym i ponownie skompiluj. Musisz usunąć „Completed” z nazwy akcji w linii 98
// Add to list of routes. routeParams.Add(new MapRouteParams() { RouteName = String.IsNullOrEmpty(routeAttrib.Name) ? null : routeAttrib.Name, Path = routeAttrib.Path, ControllerName = controllerName, ActionName = methodInfo.Name.Replace("Completed", ""), Order = routeAttrib.Order, Constraints = GetConstraints(methodInfo), Defaults = GetDefaults(methodInfo), ControllerNamespace = controllerClass.Namespace, });
Następnie w AsyncController udekoruj XXXXCompleted ActionResult znanymi
UrlRoute
iUrlRouteParameterDefault
atrybutami:[UrlRoute(Path = "ActionName/{title}")] [UrlRouteParameterDefault(Name = "title", Value = "latest-post")] public ActionResult ActionNameCompleted(string title) { ... }
Mam nadzieję, że pomoże to komuś z tym samym problemem.
źródło