Как сопоставить параметры запроса с параметрами маршрута после отправки GET-формы - PullRequest
0 голосов
/ 06 мая 2019

На моей странице есть простая GET-форма с одним параметром (скажем, query). Если я отправляю форму, она перенаправляет меня на /Controller/Action?query=value. Я бы хотел, чтобы меня перенаправили на /Controller/Action/value.

Как мне этого добиться? Механизм перезаписи URL? Что-то с настройкой маршрутизации?

Ответы [ 4 ]

1 голос
/ 09 мая 2019

Вы можете использовать URL Redirect для реализации этого. Попробуйте обратиться к моей демонстрации ниже:

1. Создайте RewriteRules класс

public class RewriteRules
{
    public static void RedirectRequests(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        if (request.Query["SearchString"].ToString() != "")
        {
            var xx = $"{context.HttpContext.Request.Path.Value}/{request.Query["SearchString"].ToString()}";
            context.HttpContext.Response.Redirect ($"{context.HttpContext.Request.Path.Value}/{request.Query["SearchString"].ToString()}");
        }        
    }
}

2. Настройте его как промежуточное ПО вstartup.cs

app.UseRewriter(new RewriteOptions()
            .Add(RewriteRules.RedirectRequests)
            );

3.Мой вид:

<form asp-controller="Home" asp-action="TestUrl" method="get">
<p>
    Title: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
</p>
</form>

4.Мое действие:

[HttpGet("Home/TestUrl/{searchString?}")]
public async Task<IActionResult> TestUrl(string searchString)
    {
        return Json(searchString);
    }

При отправке /Home/TestUrl?searchString=hello он будет перенаправленна /Home/TestUrl/hello и верните «привет».

0 голосов
/ 06 мая 2019

Я думаю, что вы ищете конфигурации маршрутизации WebApi. Если мое предположение верно, то вам нужно записать это в свой файл WebApi.config в папке App_start.

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
config.Routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });

Таким образом, на основе запроса маршрута он будет отображаться с соответствующим направлением маршрута и доставит вас к конкретному контроллеру и методу действия согласно запросу.

0 голосов
/ 06 мая 2019

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

[Route("[controller]")]
public class TestController : Controller
{
    [HttpGet("something/{value}")]
    // -------^^^^^^^^^^^^^^^^^ is the route template.
    public IActionResult Something(string value)
    {
        return View();
    }
}

вы можете позвонить Something с /test/something/5 и value будет 5.

0 голосов
/ 06 мая 2019

Я бы посоветовал вам обработать это с помощью запроса Get из javascript, где вы можете обработать формат URL, чтобы получить метод Get to the требуемое действие. По умолчанию привязка getform передает параметр как часть строки запроса в URL. Перед отправкой данных получите данные из формы и сделайте запрос Get через Ajax, если вы хотите передать параметр в правильный URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...