asp.net mvc id не извлекается из маршрута? - PullRequest
2 голосов
/ 10 ноября 2009

Я пока не делаю какие-то необычные шаблоны маршрутов, просто основной контроллер, действие, стиль идентификатора.

Тем не менее, мои действия никогда не передаются. Когда я вставляю точку останова в любое из моих действий, значение параметра id равно нулю. Что дает?

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);
    }
}

Действие Index () для TenantsController.cs:

/// <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 всегда равно нулю !!! Argh! Глупая часть в том, что когда я использую Route Debugger Фила Хаака, я ясно вижу, что отладчик видит идентификатор. Что за хрень?!

Ответы [ 2 ]

9 голосов
/ 10 ноября 2009

Я думаю, что имя параметра вашего метода контроллера должно совпадать с именем в строке маршрута. Так что, если это в вашем 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)
5 голосов
/ 10 ноября 2009

Измените метод на Index( int? id ) вместо Index( int? tenantId ), и он будет заполнен при маршрутизации.

В ваших маршрутах вы объявили переменную с именем "id", но затем пытаетесь получить к ней доступ, используя "tenantId". tenantId будет заполнен, если, например, вы заходите на страницу и добавляете строку запроса ?tenantId=whatever.

ASP.NET MVC интенсивно использует рефлексию, поэтому имена, которые вы даете своим методам и параметрам, имеют значение в подобных случаях.

...