asp.net mvc id没有被拉出路线?

时间:2009-11-10 02:33:23

标签: asp.net-mvc asp.net-mvc-routing action

我还没有做任何花哨的路线模式,只是基本的控制器,动作,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。什么垃圾?!

2 个答案:

答案 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大量使用反射,因此您提供方法和参数的名称在这些情况下很重要。