маршрутизация asp mvc с двумя необязательными параметрами - PullRequest
6 голосов
/ 21 февраля 2011

Привет. Как мне отобразить URL .. / Компании / Результаты / Значение / ID , если оба параметра являются необязательными?

Companies - контроллер, Results - действие, значение и id - необязательные параметры. На моей форме текстовое поле для значения и список выбора для идентификатора. Пользователь может выбрать оба или один из них для поиска. Пробовал что-то вроде этого, но не может обработать, когда отсутствует один из необязательных параметров, скажем, value, например ../Companies/Results/ / id

        routes.MapRoute(
            "Company+Profession", // Route name
            "{action}/{value}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

Ответы [ 3 ]

9 голосов
/ 21 февраля 2011

У вас не может быть маршрута, который имеет два необязательных параметра, только последний параметр может быть необязательным именно из-за описанной проблемы.Я полагаю, что у вас есть параметр по умолчанию для value, например byid , и используйте его, когда человек выбирает профессию.

Я предполагаю, что вы создаете URL с помощью JavaScript, так какиспользование действия формы GET приведет к добавлению имен параметров в URL.В этом случае, когда текстовое поле пусто, просто вставьте значение по умолчанию byid .

Обновите ваш маршрут, включив в него значение по умолчанию, чтобы все сгенерированные вами URL работали.См. Статью Фила Хаака об этом альтернативном способе обработки URL-адресов, имеющих два «необязательных» параметра.

// used when both parameters are specified
routes.MapRoute(
        "Company+Profession", // Route name
        "{action}/{value}/{profId}", // URL with parameters
        new { controller = "Companies", action = "Index", value ="byid", profId = UrlParameter.Optional } // Parameter defaults
);
1 голос
/ 21 февраля 2011

Спасибо, ребята, только что обнаружили ограничения маршрута для целых чисел.И так возиться с некоторыми комбинациями маршрутов, кажется, работает так, как я хочу:

        routes.MapRoute(
           "Detail", // Route name
           "{action}/{value}", // URL with parameters
           new { controller = "Companies", action = "Detail" }, // Parameter defaults
           new { value = @"\d+" } //integer only
        );

        routes.MapRoute(
            "Company + Profession", // Route name
            "{action}/{value}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Results" }, // Parameter defaults
            new { profId = @"\d+" } //integer only
        );

        routes.MapRoute(
            "Profession", // Route name
            "{action}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Results"}, // Parameter defaults
            new {profId = @"\d+" } //integer only
        );

        routes.MapRoute(
           "Company", // Route name
           "{action}/{value}", // URL with parameters
           new { controller = "Companies", action = "Results" } // Parameter defaults
       );

        routes.MapRoute(
            "RootFolder", // Route name
            "{action}/{value}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional } // Parameter defaults
        );
0 голосов
/ 21 февраля 2011

Я не уверен, так как у меня нет сейчас, где это попробовать, но вот мое предложение

routes.MapRoute(
            "Company+Profession", // Route name
            "Companies/{action}/value-{value}/id-{profId}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults
        );
...