我还没有做任何花哨的路线模式,只是基本的控制器,动作,id风格。
然而,我的行为似乎永远不会传递给我。当我在任何一个动作中粘贴断点时,id参数的值为null。是什么给了什么?
的Global.asax.cs:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Tenants", action = "Index", id = "" } // Defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
//RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
}
protected void Application_AuthenticateRequest()
{
if (User != null)
Membership.GetUser(true);
}
}
TenantsController.cs上的Index()操作:
/// <summary>
/// Builds the Index view for Tenants
/// </summary>
/// <param name="tenantId">The id of a Tenant</param>
/// <returns>An ActionResult representing the Index view for Tenants</returns>
public ActionResult Index(int? tenantId)
{
//a single tenant instance, requested by id
//always returns a Tenant, even if its just a blank one
Tenant tenant = _TenantsRepository.GetTenant(tenantId);
//returns a list of TenantSummary
//gets every Tenant in the repository
List<TenantSummary> tenants = _TenantsRepository.TenantSummaries.ToList();
//bilds the ViewData to be returned with the View
CombinedTenantViewModel viewData = new CombinedTenantViewModel(tenant, tenants);
//return index View with ViewData
return View(viewData);
}
tenantId参数的值是空的!哎呀!愚蠢的部分是当我使用Phil Haack的Route Debugger时,我可以清楚地看到调试器看到了id。什么垃圾?!
答案 0 :(得分:9)
我认为你的控制器方法的参数名称需要匹配路由字符串中的名称。所以如果这是你的global.asax:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Tenants", action = "Index", id = "" } // Defaults
);
您的控制器方法应该如下所示(注意参数名称是'id',而不是'tenantId'):
public ActionResult Index(int? id)
答案 1 :(得分:5)
将方法更改为Index( int? id )
而不是Index( int? tenantId )
,并将通过路由填充。
在您的路线中,您已将变量声明为“id”,但您正尝试使用“tenantId”访问它。例如,如果您访问页面并添加查询字符串?tenantId=whatever
,则会填写tenantId。
ASP.NET MVC大量使用反射,因此您提供方法和参数的名称在这些情况下很重要。