我正在尝试路由并为搜索生成一个对 seo 友好的 url。
目前我有如下视图模型:
public class SearchFormViewModel
{
//[Required(ErrorMessage="Keyword is required")]
public string Keyword { get; set; }
public IEnumerable<SelectListItem> TransactionTypes { get; set; }
public int TransactionTypeId { get; set; }
public IEnumerable<SelectListItem> RoomLookUps { get; set; }
public int? MinBeds { get; set; }
public int? MaxBeds { get; set; }
...
}
提交此表单后,它会转到控制器:
public ActionResult SearchProperties(SearchFormViewModel viewModelInp)
{
// Perform search;
}
并显示搜索结果。但是,生成的 url 如下所示:
http://localhost:49191/search/searchproperties?Keyword=London&TransactionTypeId=2&MinBeds=&MaxBeds=&MinPrice=&MaxPrice=
我需要一个看起来像
http://localhost:49191/flats-to-rent/London?MinBeds=&MaxBeds=&MinPrice=&MaxPrice=
我不确定如何将参数从视图模型传递到路由
以下路由不起作用:
routes.MapRouteLowercase(
"Search-Properties-Buy",
"flats-to-rent/{Keyword}",
new { controller = "Search", action = "SearchProperties", Keyword = UrlParameter.Optional },
new { TransactionTypeId = "2" }
);
我已经尝试了其他各种方法,但似乎都不起作用,并且出现404错误。
我找不到任何可能对我有帮助的例子。
好吧,我试着给你一个解决方案。放置一个包含由 asp.net mvc 生成的基本路由的输入字段:
<input type="hidden" value="@Url.Action("SearchProperties", new { Keyword = "{Prototype}" })" id="BaseSearchURL" />
如您所见,我指定了一个带有"{Prototype}"值的关键字,这指示 asp.net mvc 提供您配置的自定义路由,并且在渲染后,在页面 HTML 中,您应该看到如下所示的内容:
<input type="hidden" value="server/flats-to-rent/{Prototype}" id="BaseSearchURL" />
之后,您可以使用 jquery 覆盖提交按钮按下事件,并且可以编写自定义代码:
$(document).ready(function() {
$('input[type=submit]').submit(function() {
var baseURL = $('#BaseSearchURL').val();
var keyword = $('input[name=Keyword]');
var action = baseURL.replace('{Prototype}', keyword);
var form = $(this).parents('form');
// Get all parameter except Keyword
var params = $('input[name!=Keyword], select, textarea', form).serialize();
action += "?" + params;
document.location = action;
});
});
步骤很简单:
- 获取以前生成的路由模板
- 必须替换为"{原型}"的 get 关键字;
- 获取表单参数并将其附加到操作中
- 调用 document.location 以启动特定 URL。