У меня есть простой класс, который содержит некоторую общую информацию о текущем веб-сайте: -
public class WebSiteSettings
{
public EnvironmentType Environment { get; set } // Eg. Production
public VersionType Version { get; set; } // Eg. Version2
public string ApiKey { get; set; } // Eg. ABCDE-1234
}
Теперь я хочу иметь следующий маршрут: -
// Api - Search methods.
routes.MapRoute(
"Search Methods",
"{versionDate}/{controller}/{action}"
);
и здесь образец url:
http://localhost.api.mydomain.com:1234/2010-01-23/search/posts?user=JonSkeet&apikey=ABCDE-1234
В настоящее время я обрабатываю apikey через пользовательский ActionFilter
. Это kewl. Но я не уверен, как я могу извлечь versiondate
(то есть. 2010-01-23) из URL-адреса и заполнить этот простой класс, который я сделал, и все контроллеры тоже будут иметь доступ.
Я изначально думал об этом:
public abstract class AbstractController : Controller
{
protected WebSiteSettings WebSiteSettings { get; set; }
protected AbstractController() : base()
{
WebSiteSettings = new WebSiteSettings();
// 1. Read in the version data and figure out the version number.
// 2. Read in the app settings to figure out the environment. (easy to do).
// 3. No api key just yet. this will be handled in the OnAuthorization action filter.
}
}
public class SearchController : AbstractController
{
public ActionResult Posts(..)
{ // ... blah ... }
}
Итак, я попробовал это, и RouteData был пустым, в абстрактном контроллере. Фактически, большая часть информации была нулевой, в абстрактном контроллере.
Итак, я не уверен, когда правильное место должно читать эти значения и создавать этот класс.
У кого-нибудь есть идея?
Возможно, вы захотите попробовать сделать это в методе AbstractController.OnActionExecuting, конструктор слишком рано.
protected override void OnActionExecuting(ActionExecutingContext context)
{
// context has all the goods
}
http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onactionexecuting.aspx?ppud=4