【发布时间】:2017-10-05 09:43:15
【问题描述】:
在页面上进行搜索时出现 url 问题。因此,我使用 GET 方法在表单中使用带有年份文本框和搜索按钮的索引视图
索引.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>
}
我将 Search as actionName 放在 BeginForm 中,因为当重定向到服务/索引时,不应在第一时间加载服务数据。所以,我使用另一个动作,“搜索”来处理这个请求,如果用户没有输入年份,那么它将加载所有数据,但如果用户输入年份,它将根据年。
这是处理请求的控制器
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
我希望 url 像这样显示
http://localhost:18132/Service/Search 或 http://localhost:18132/Service/Search/Year/2017
我的路由有什么问题?如何解决?
【问题讨论】:
-
添加
new { Year = Model.Year }作为路由参数是没有意义的,因为它是要绑定的输入值。您将表单提交给 GET 方法,这意味着输入的值只会作为查询字符串值添加(浏览器对您的服务器端路由定义一无所知。但是您可以使用 javascript 来构建 url 和使用location.href=..(并取消表单提交) -
@StephenMuecke 是的,你是对的,但我从这个网站 stackoverflow.com/questions/28176634/… 获得了该代码。它有同样的问题,但为什么他能做到,而我却不行?有什么区别?
-
该问题中接受的答案没有任何输入 - 它只是发回路由参数的硬编码值(并且 OP 只是有隐藏的输入,所以无论如何有一个表单都是无稽之谈)
-
以this answer为例(除非您处理表单
.submit()事件并取消它) -
是的,您的路由定义是服务器端代码 - 浏览器不知道它们。它也在 HTML 标准中定义
标签: c# asp.net asp.net-mvc asp.net-mvc-routing