ASP.NET MVC:将搜索属性放入url(不是查询字符串)

时间:2016-01-11 08:57:15

标签: c# asp.net asp.net-mvc

在我的ASP.NET MVC 5应用程序上实现了过滤。 我的搜索框包含一些具有预定义值的下拉列表。当Dropdownlist值更改时,表单将被提交,我会看到特定方法的所有可用票证。

表单提交页面重新加载后,我看到像mysite.com/?Method=car这样的网址。但我想摆脱查询字符串并将汽车直接放入网址,即 mysite.com/method/carmysite.com/method/plain

有可能吗?

搜索框

@using (Html.BeginForm("Search", "Transfer", FormMethod.Get))
{
    <div class="form-horizontal">
        <div class="form-group">
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.Method, Model.Methods, new { @class = "query"})
            </div>
        </div>
    </div>
    <input type="submit" class="hidden" />
}

我的行动方法

[Route("~/transfer/{method?}")]
public async Task<ActionResult> List(string method)
{
    //filter and displaying
    return View(viewModel);
}

2 个答案:

答案 0 :(得分:2)

默认Html.BeginForm FormMethod.Get会将所有表单值序列化为查询字符串。因此,如果您需要友好的URL,您将不得不编写一些JavaScript(在此示例中为jQuery)。

首先,您可以删除表单

<div class="form-horizontal">
        <div class="form-group">
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.Method, Model.Methods, new { @class = "query"})
            </div>
        </div>
    </div>
<button type="button" id="submitMethodBtn">Submit</button>

<script>
   var baseUrl = '@Url.Action("Search", "Transfer")/'
   $('#submitMethodBtn').click(function(){
       var url = baseUrl + $(#'@Html.IdFor(m=>m.Method)').val();
       window.location.href = url;
   })
</script>

一些问题/澄清:

1 如果您在浏览器中输入mysite.com/method/car(假设问题#2已解决),它将带您进行正确的操作,因此您的问题基本上是在视图中生成友好的Url。

2 在提供的代码示例中,我使用了内联脚本。您可以将其解压缩到单独的静态文件中,但您必须对方法属性的url和html id进行硬编码。

3 您的操作方法获取int作为参数,那么您希望它如何与mysite.com/method/car一起使用(car是一个字符串)?

答案 1 :(得分:1)

您可以在页面上调用ajax方法,这将避免查询字符串,当控制器重定向到ActionResult时,您可以再次调用重定向页面上的ajax方法。通过这种方式,您可以避免MVC中的查询字符串。 以下面的代码为例。

$.ajax({  
      type: "POST",  
      contentType: "application/json; charset=utf-8",  
      url: "Transfer/search",  
      data: "{ID:1}",  
      dataType: "json",  
      error: function(xhr, ajaxOptions, thrownError) { alert(xhr.responseText); }
 });

将返回类型设为控制器方法的JsonResult。