Я работаю над созданием внешнего интерфейса MVC для системы CMS. Система CMS будет обслуживать ASP.NET MVC со страницами и контентом.
В Global.asax я зарегистрировал собственный обработчик маршрута, подобный этому:
public class MvcApplication : EPiServer.Global
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route("{*data}", new MvcRouteHandler()));
}
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(new MvcControllerFactory());
ModelBinders.Binders.Add(typeof(MvcPageData), new PageDataModelBinder());
RegisterRoutes(RouteTable.Routes);
}
}
Вот так выглядит мой обработчик маршрута:
public class MvcRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MvcRequestHandler(requestContext);
}
}
И мой обработчик запросов MVC:
protected void ProcessRequest(HttpContext httpContext)
{
List<string> pageParams;
// Get the requested page from the CMS
EPiServer.UrlBuilder internalUrlBuilder = GetInternalUrl(httpContext.Request.RawUrl, out pageParams);
MvcPageData mvcPage =
CurrentPageResolver.Instance.GetCurrentPage(internalUrlBuilder.QueryCollection["id"] ??
string.Empty);
string controllerName = mvcPage.ControllerName;
if (pageParams.Count == 0)
{
mvcHandler.RequestContext.RouteData.Values.Add("action", "Index");
}
else
{
mvcHandler.RequestContext.RouteData.Values.Add("action", pageParams[0]);
}
mvcHandler.RequestContext.RouteData.Values.Add("controller", controllerName);
mvcHandler.RequestContext.RouteData.Values["data"] = mvcPage; // This works fine, but I also want to add the remidning pageParams
IController controller = ControllerBuilder.Current.
GetControllerFactory().CreateController(mvcHandler.RequestContext, controllerName);
controller.Execute(mvcHandler.RequestContext);
}
Вот как сегодня выглядит контроллер:
public class StandardController : Controller
{
public ActionResult Index(MvcPageData currentPage)
{
return View(currentPage);
}
}
Моя проблема в том, что я хочу иметь возможность передавать более одного параметра в контроллер, поэтому мне нужно изменить mvcHandler.RequestContext.RouteData.Values ["data"], чтобы он содержал какой-то список параметров. Я искал, но не нашел решения проблемы, может быть, это действительно просто. Получившийся контроллер может выглядеть примерно так:
открытый индекс ActionResult (MvcPageData currentPage, int id, имя строки)
Кто-нибудь знает, как это сделать? Спасибо.