我正在为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”]以包含某种参数列表。我已搜索但未找到问题的解决方案,也许它非常简单。最终的控制器可能看起来像这样:
公共ActionResult索引(MvcPageData currentPage,int id,string name)
任何人都知道如何做到这一点?感谢。
答案 0 :(得分:0)
您可以尝试创建项目数量为pageParams.Count的对象数组,并添加mvcPage对象和pageParams中除第一个对象之外的所有对象(这是您的操作名称)。
答案 1 :(得分:0)
我误解了模型绑定在MVC中是如何工作的。我认为发送到控制器的所有数据必须在调用controller.Execute之前在ProcessRequest中定义,但事实并非如此。
答案 2 :(得分:0)
您是否尝试在Web.config中注册处理程序?
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="yourApiUrlPrefix/*"
type="MvcRouteHandler, YourAssemblyName" />
</httpHandlers>
</system.web>
</configuration>