提交GET表单后如何将查询参数映射到路由参数

时间:2019-05-06 09:48:45

标签: asp.net-mvc asp.net-core asp.net-core-mvc

我的页面上有一个简单的GET表单,带有一个参数(让我们说query)。如果我提交表单,它会将我重定向到/Controller/Action?query=value。我想重定向到/Controller/Action/value

我该如何实现? URL重写机制?有路由配置吗?

4 个答案:

答案 0 :(得分:1)

您可以使用URL重定向来实现这一点。尝试参考下面的演示:

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并返回“ hello”。

答案 1 :(得分:0)

我建议您使用javascript的Get请求来处理此问题,您可以在其中处理URL格式以使Get达到所需的操作方法。默认情况下,getform的绑定将参数作为URL上查询字符串的一部分传递。 在提交数据之前,如果要将参数传递到正确的url,请从表单获取数据并通过Ajax发出Get请求。

答案 2 :(得分:0)

我认为您正在寻找WebApi路由配置。如果我的猜测是正确的,那么您需要在App_start文件夹中的WebApi.config文件中编写它。

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) });

因此,根据路由请求,它将映射到相应的路由方向,并根据请求将您带到特定的控制器和操作方法。

答案 3 :(得分:0)

您只需要在路由模板中包含参数,它将为您完成此操作。给定这个示例控制器:

 (2, 3)
  *  | 
 (5, 3)
   ||
 (10,3)

您可以用[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