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

C# 从具有多个参数作为数据的请求处理程序调用ASP.NET MVC控制器,c#,asp.net-mvc,routing,asp.net-mvc-routing,C#,Asp.net Mvc,Routing,Asp.net Mvc Routing,我正在为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 MvcRouteHandl

我正在为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);
}
我的问题是,我希望能够将多个参数传递给控制器,因此我需要更改mvcHandler.RequestContext.RouteData.Values[“data”]以包含某种类型的参数列表。我已经搜索过了,但没有找到解决问题的方法,也许真的很简单。生成的控件可能如下所示:

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);
    }
}
公共操作结果索引(MvcPageData currentPage,int id,字符串名称)


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

您可以尝试使用items count pageParams创建对象数组。计算并添加mvcPage对象和pageParams中的所有对象,但第一个对象除外(这是您的操作名称)。

我不理解模型绑定在MVC中的工作原理。我认为发送到控制器的所有数据都必须在调用controller.Execute之前在ProcessRequest中定义,事实并非如此

您是否尝试在Web.config中注册处理程序

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


MVC是开箱即用的,有什么理由不使用默认功能吗?我不理解模型绑定在MVC中是如何工作的。我认为发送到控制器的所有数据都必须在调用controller.Execute之前在ProcessRequest中定义,事实并非如此。请随意投票结束这个问题。