我在网页上搜索时遇到网址问题。因此,我使用GET方法
在表单内部使用年份文本框和搜索按钮Index.cshtml
@using (Html.BeginForm("Search", "Service", new { Year = Model.Year }, FormMethod.Get))
{
<p>
<div class="form-inline">
@Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control", @placeholder = "Enter Year" } })
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-search"></span> Search</button>
</div>
</p>
}
我将搜索范围actionName
放在BeginForm
中,因为在重定向到服务/索引时,不应该首次加载服务数据。所以,我正在使用另一个Action,“Search”来处理这个请求,如果用户没有输入年份,那么它将加载所有数据,但是如果用户输入年份,它将加载基于年。
这是处理请求的控制器
ServiceController.cs
public ActionResult Index()
{
var vm = new ServiceIndexViewModel();
return View(vm);
}
public async Task<ActionResult> Search(int? year)
{
var vm = new ServiceIndexViewModel();
if (ModelState.IsValid)
{
var list = await service.Search(year);
vm.Services = AutoMapper.Mapper.Map<IEnumerable<ServiceListViewModel>>(list);
}
return View("Index", vm);
}
以及处理路由的自定义路由
RouteConfig.cs
routes.MapRoute(
"ServiceSearch",
"Service/Search/{Year}",
new { controller = "Service", action = "Search", Year = UrlParameter.Optional }
);
// default route
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Company", action = "Index", id = UrlParameter.Optional }
);
但是我有这样的网址:
http://localhost:18132/Service/Search?Year=或http://localhost:18132/Service/Search?Year=2017
我希望网址像这样显示
http://localhost:18132/Service/Search或http://localhost:18132/Service/Search/Year/2017
我的路由有什么问题?怎么解决这个问题?
答案 0 :(得分:0)
首先,您的路线应该像这样定义:
routes.MapRoute(
"ServiceSearch",
"Service/Search/Year/{Year}",
new { controller = "Service", action = "Search", Year = UrlParameter.Optional });
但是你的问题是你的代码没有落到这个定义的路线上的问题,它落到了默认路线上。确保默认路线低于这条路线,如果它还没有工作,请在这里评论我,我会告诉你我的想法。