在我的ASP.NET MVC 5应用程序上实现了过滤。 我的搜索框包含一些具有预定义值的下拉列表。当Dropdownlist值更改时,表单将被提交,我会看到特定方法的所有可用票证。
表单提交页面重新加载后,我看到像mysite.com/?Method=car
这样的网址。但我想摆脱查询字符串并将汽车直接放入网址,即
mysite.com/method/car
或mysite.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);
}
答案 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。