. Net Core MVC - Как отправить форму MVC в actionMethod с атрибутом Route, который включает параметры - PullRequest
0 голосов
/ 03 августа 2020

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

[Route("Prop/{location}/{category}/{p}")]
public IActionResult Search(string location, string category, int p, string q)
{
    var vm = new ReloadVm();
    // rest of the code 
    return View(vm);
}

Если я использую Html.BeginForm, я получаю 404, поскольку он попытается загрузить https://localhost:44326/prop/search, а не пользовательский маршрут. Раньше я использовал window.location.href, но мне сказали, что это плохо работает с Google, а теперь Chrome отменяет запросы URL-адресов этим вызовом Javascript, поэтому он не кажется стабильным.

Как лучше всего справиться с этим?

Кроме того, этот метод действия имеет около 15 параметров, и, чтобы url оставался чистым, я хотел бы передать обратно только те параметры, которые не равны нулю или 0 , поэтому я бы получил url, например /Prop/London/Job/1?q=whatever&tt=222.

Обновление - window.location.href работает, кнопка «триггер» должна была быть определена как type=button, иначе она отменит JS запрос и рассматривать его как отправку.

Все еще ищем лучший способ сделать это без JS

1 Ответ

0 голосов
/ 03 августа 2020

Предполагается, что имя вашего контроллера PropController.

@using (Html.BeginForm("Search", "Prop", new
{
    location = "somewhere",
    category = "something",
    p = 1
}))
{
    <input name="q"/>
}

Сделайте параметры необязательными.

[Route("Prop/{location}/{category}/{p}")]
public IActionResult Search(string location, string category, int p, string q = null)
{
    var vm = new ReloadVm();
    // rest of the code 
    return View(vm);
}

ИЛИ используйте привязку модели

public class Model
{
    public string q { get; set; }
}
[Route("Prop/{location}/{category}/{p}")]
public IActionResult Search(string location, string category, int p, MyModel m)
{
    var q = m?.q;
    var vm = new ReloadVm();
    // rest of the code 
    return View(vm);
}
...