2010-04-22 18 views
0

我正在建立一個MVC前端的CMS系統的工作。 CMS系統將爲ASP.NET MVC提供頁面和內容。從調用請求處理程序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 [「數據」]包含某種名單的參數。我已經搜索,但沒有找到解決問題的辦法,也許它很簡單。得到的CONTROLER可能是這個樣子:

公衆的ActionResult指數(MvcPageData當前頁,INT ID,字符串名稱)

任何人知道如何做到這一點?謝謝。

+0

MVC開箱即用,是否有任何理由不使用默認功能? – queen3 2010-04-22 13:28:32

+0

我錯過了模型綁定在MVC中的工作原理。我認爲在調用controller.Execute之前,必須在ProcessRequest中定義發送給控制器的所有數據,事實並非如此。 隨意投票關閉這個問題。 – 2010-04-29 12:34:05

回答

0

我missunderstood如何模型MVC結合的作品。我認爲在調用controller.Execute之前,必須在ProcessRequest中定義發送給控制器的所有數據,事實並非如此。

0

您可以嘗試創建項目對象計數pageParams.Count和pageParams添加到它的mvcPage對象和所有對象除了第一個(這是你的動作名)的陣列。

0

您是否嘗試過在Web.config中註冊處理程序?

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