ASP.NET MVC: первый параметр в методе действия всегда пуст при отправке формы - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема при передаче значений в метод действия контроллера.

У меня есть такая карта маршрутов:

routes.MapRoute(
   name: "VehicleAdvancedSearchResult",
   url: "search-result/{searchTypeSlug}/{condition}/{makeSlug}/{modelName}/{modelExt}/{categorySlug}/{parishSlug}/{yearRange}/{priceRange}",
   defaults: new
      {
         controller = "SearchResult",
         action = "VehicleAdvanceSearch",
         //SearchTypeSlug = UrlParameter.Optional
         //Condition = UrlParameter.Optional,
         //MakeSlug = UrlParameter.Optional,
         //ModelName = UrlParameter.Optional,
         //ModelExt = UrlParameter.Optional,
         //CategorySlug = UrlParameter.Optional,
         //ParishSlug = UrlParameter.Optional,
         //YearRange = UrlParameter.Optional,
         //PriceRange = UrlParameter.Optional
      }
   );

Я пытался с UrlParameter.Optional, но это не сработало.

В представлении у меня есть форма, не определенная по умолчанию action, но когда я нажимаю "Отправить", атрибут действия добавляется в нее с правильными значениями.

action attribute is added to form with correct values and pattern

Проблема в том, что первое значение параметра всегда появляется в виде пустой строки при фактическом вызове метода контроллера.

Debug result

Что я делаю не так?

Другая проблема заключается в том, что я хочу, чтобы метод действия вызывался, даже если URL частично завершен или даже не имеет параметров. В моем случае, если я наберу просто http://locahots:55904/search-result/ или http://locahots:55904/search-result/for-sale/, то есть до тех пор, пока оно является частичным, я всегда получаю 404. Но я хочу, чтобы они перенаправляли на другую страницу, если это частичный URL.

Я уже сделал эту проверку в своем методе действия, но этот метод вообще не вызывается с частичным URL.

Это необходимо, поскольку Google сканирует URL-адреса отдельно для каждой структуры папок, чтобы проиндексировать их.

Как я могу предотвратить это?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

routes.MapRoute(
   name: "VehicleAdvancedSearchResult_V2",
   url: "search-result/{parameterName?}",
  defaults: new
  {
     controller = "SearchResult",
     action = "VehicleAdvanceSearch",
   }
  );

Второй способ заключается в том, что вы можете применить Маршрутизацию атрибутов к этому действию, используя Атрибут маршрута. Например:

 [Route("[action]/{parameterName?}")] //?--> for optional parameter
 public ActionResult VehicleAdvanceSearch()

Чтобы решить проблему с нулевым первым параметром, вы можете создать модель для всех параметров, а затем выполнить действие контроллера с модальным параметром. Например:

 [HttpPost]
 public ActionResult VehicleAdvanceSearch(SearchResultModel model){}
0 голосов
/ 27 апреля 2018

Для метода контроллера, если вы хотите частично вызвать, вам необходимо определить дополнительные параметры в методе

Например,

Public ActionResult <method name>(string param1="",string param2=""){}

Теперь, если вы хотите вызвать метод с частичными аргументами, вам нужно передать аргумент справа налево.

Или альтернативный способ - вы можете переопределить метод с помощью другой опции аргументов.

...