代码之家  ›  专栏  ›  技术社区  ›  Peter Moberg

从具有多个参数作为数据的请求处理程序调用ASP.NET MVC控制器

  •  0
  • Peter Moberg  · 技术社区  · 15 年前

    我正在为CMS系统构建MVC前端。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”]以包含某种类型的参数列表。我已经搜索过了,但没有找到解决问题的方法,也许这真的很简单。生成的控制器可能如下所示:

    公共操作结果索引(mvcpagedata currentpage,int id,string name)

    有人知道怎么做吗?谢谢。

    3 回复  |  直到 10 年前
        1
  •  0
  •   Branislav Abadjimarinov Ivan Choo    15 年前

    您可以尝试使用items count pageparams.count创建对象数组,并将mvcpage对象和pageparams中除第一个对象(即您的操作名)之外的所有对象添加到该数组中。

        2
  •  0
  •   Peter Moberg    12 年前

    我误解了模型绑定在MVC中的工作方式。我认为在调用controller.execute之前,必须在processRequest中定义发送到控制器的所有数据,但事实并非如此。

        3
  •  0
  •   d.popov    10 年前

    您尝试在web.config中注册处理程序了吗?

    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="yourApiUrlPrefix/*" 
            type="MvcRouteHandler, YourAssemblyName" />
        </httpHandlers>
      </system.web>
    </configuration>