Вызов контроллера ASP.NET MVC из обработчика запросов с несколькими параметрами в качестве данных - PullRequest
0 голосов
/ 22 апреля 2010

Я работаю над созданием внешнего интерфейса 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, имя строки)

Кто-нибудь знает, как это сделать? Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 августа 2012

Я неправильно понял, как работает привязка модели в MVC. Я думал, что все данные, отправляемые в контроллер, должны быть определены в ProcessRequest перед вызовом controller.Execute, что не так.

0 голосов
/ 30 сентября 2014

Вы пытались зарегистрировать обработчик в Web.config?

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="yourApiUrlPrefix/*" 
        type="MvcRouteHandler, YourAssemblyName" />
    </httpHandlers>
  </system.web>
</configuration>
0 голосов
/ 22 апреля 2010

Вы можете попытаться создать массив объектов с количеством элементов pageParams.Count и добавить к нему объект mvcPage и все объекты из pageParams, кроме первого (которое является именем вашего действия).

...