2016-06-25 5 views
0

Когда я передать несколько параметров действия контроллера, я получаю вопросительные знаки в параметрах, как это:Как удалить знаки вопроса в Asp.net MVC маршрутов несколько параметров

http://localhost:57728/Home/AddAndManageProperties?BaseCategoryId=11&SubCategoryId=14

Я хочу, чтобы удалить вопросительные знаки, чтобы быть похожим на это:

http://localhost:57728/Home/AddAndManageProperties/BaseCategoryId=11/SubCategoryId=14

вот мой код:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "MyRout", 
      url: "{controller}/{action}/{BaseCategoryId}/{SubCategoryId}", 
      defaults: new { controller = "Home", action = "AddAndManageProperties", BaseCategoryId = UrlParameter.Optional, SubCategoryId = UrlParameter.Optional } 
     ); 


    } 
} 

А вот метод действий:

public ActionResult AddAndManageProperties(int? BaseCategoryId, int? SubCategoryId) 
     { 
     } 

И я вызываю метод AddAndManageProperties этим методом

[HttpPost] 
    public ActionResult AddSubCategory(SubCategory subCategory) 
    { 
     return RedirectToAction("AddAndManageProperties", new { BaseCategoryId = subCategory.BaseCategoryId, SubCategoryId = subCategory.SubCategoryId }); 
} 

Я новичок в ASP.NET MVC, поэтому, пожалуйста, помогите мне!

+0

Сначала вам нужно удалить 'BaseCategoryId = UrlParameter.Optional, SubCategoryId = UrlParameter.Optional' - только последний параметр может быть необязательным. Затем, если вы измените его на «url:» Home/AddAndManageProperties/{BaseCategoryId}/{SubCategoryId} "и переместите его до маршрута по умолчанию, он будет работать, если ваш метод имеет соответствующие имена параметров. –

+0

@ StephenMuecke Большое вам спасибо за вашу помощь :) Не могли бы вы, пожалуйста, написать код, чтобы я мог его понять ... извините, я очень новичок в mvc. Спасибо – Lucia

+0

Сначала отредактируйте свой вопрос, чтобы включить подпись вашего метода 'AddAndManageProperties()', и покажите, как вы генерируете URL-адрес (я предполагаю, что вы используете '@ Html.ActionLink()'? –

ответ

0

Перемещение MyRout быть перед Default маршрута и изменить его на

routes.MapRoute(
    name: "MyRout", 
    url: "Home/AddAndManageProperties/{BaseCategoryId}/{SubCategoryId}", 
    defaults: new { controller = "Home", action = "AddAndManageProperties" } 
); 

Обратите внимание, что только последний параметр может быть отмечен UrlParameter.Optional поэтому метод должен быть

public ActionResult AddAndManageProperties(int BaseCategoryId, int SubCategoryId) 

для выше маршрут, или

public ActionResult AddAndManageProperties(int BaseCategoryId, int? SubCategoryId) 

если yo U изменить вышеуказанное определение маршрута к

defaults: new { controller = "Home", action = "AddAndManageProperties", SubCategoryId = UrlParameter.Optional } 

Примечание, если вы хотите включить текст «BaseCategoryId» и «SubCategoryId» в пути, используйте

url: "Home/AddAndManageProperties/BaseCategoryId/{BaseCategoryId}/SubCategoryId/{SubCategoryId}", 
+0

Это работает Спасибо большое :) Это HTTP: // локальный: 57728/Главная/AddAndManageProperties/14/17 Могу ли я сделать это так? http: // localhost: 57728/Главная/AddAndManageProperties/BaseCategoryId/14/SubCategoryId/17 – Lucia

+0

Несомненно - просто измените его на «url:» Home/AddAndManageProperties/BaseCategory/{BaseCategoryId}/SubCategory/{SubCategoryId} ",' (и когда вы помещаете url в комментарии, окружайте его обратными выводами :) –

+0

Спасибо, но я пробовал это и не работал URL: «Главная/AddAndManageProperties/BaseCategory/{BaseCategoryId}/SubCategory/{SubCateg oryId}", defaults : new {controller = "Home", action = "AddAndManageProperties"} – Lucia

0

Эти вопросительные знаки используются для строк запроса, и они требуются, потому что это то, как данные присваиваются параметрам, которые ожидают ваши действия. Вы не должны пытаться их удалить, но вы можете использовать атрибут [FromBody], а не отправлять параметры в строке запроса.

0

Во-первых, и самое главное, ваш маршруты находятся в неправильном порядке, и у вас есть несколько возможных URL-адресов, которые приводят к вызову неправильного маршрута. См. Why map special routes first before common routes in asp.net mvc для пояснения.

Во-вторых, routes cannot contain more than one UrlParamter.Optional.

В-третьих, знак = действителен только в строке запроса, unless it is encoded. Но ИМО, вы должны not use unsafe characters in a URL, чтобы избежать всех головных болей, которые приходят с ними. Лучшей альтернативой в этом случае было бы заменить = на -.

Наконец, если вы хотите по-настоящему сделать параметры факультативными, один из подходов - provide multiple routes, которые допускают параметры на определенных маршрутах, но не другие.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
       name: "BaseCategoryAndSubCategoryId", 
       url: "{controller}/{action}/BaseCategoryId-{BaseCategoryId}/SubCategoryId-{SubCategoryId}", 
       defaults: new { controller = "Home", action = "AddAndManageProperties" } 
     ); 

     routes.MapRoute(
      name: "BaseCategoryIdOnly", 
      url: "{controller}/{action}/BaseCategoryId-{BaseCategoryId}", 
      defaults: new { controller = "Home", action = "AddAndManageProperties" } 
     ); 

     routes.MapRoute(
      name: "SubCategoryIdOnly", 
      url: "{controller}/{action}/SubCategoryId-{SubCategoryId}", 
      defaults: new { controller = "Home", action = "AddAndManageProperties" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Примечание:Stephen's answer также является хорошей альтернативой этому подходу, если ваши параметры требуется быть переданы в URL. IMO, имеет смысл использовать требуемые параметры, если для вашего действия требуется, чтобы оба из них работали.

Но самым простым вариантом является простое использование строки запроса. Параметры, естественно, могут быть факультативными и добавляться в любом порядке, если вы это сделаете, и вам не нужно ничего больше, чем ваш маршрут Default.

+0

Большое вам спасибо :) Я только что видел ваш ответ прямо сейчас .. он тоже работает. Будьте здоровы :) – Lucia

Смежные вопросы