使用ASP.NET MVC路由机制设置正确的操作属性值时遇到问题。
我在$('#operators').val(operator_id)
课程中使用routes.MapMvcAttributeRoutes();
,我自己为每个动作设置了URL地址。现在我希望表单在提交后移动到定义的URL地址,但是在action属性中没有正确的URL(或者没有)。
这是我使用的代码。
控制器:
RouteConfig
现在是.cshtml文件片段:
[RoutePrefix("search")]
public class SearchController : BaseController
{
[HttpGet]
[Route("search/{query}/{author?}/{category?}/{mediaType?}/{color?}/{resultPerPage?}/{startElement?}", Name = "Search_Search")]
public ActionResult Search(string query, string author = "none", int category = 0, int mediaType = 0, int color = 0, int resultsPerPage = 15, int startElement = 0)
{
//doing some stuff here...
}
}
生成表单中的Action属性类似于" / Search / Search",但该地址不起作用(404错误)。我尝试使用@using (Html.BeginForm("Search", "Search", FormMethod.Get))
{
}
,无论是否有其他路由配置:
Html.BeginRouteForm
我尝试过两种方式,routes.MapRoute(
name: "SearchFormRoute",
url: "search/search/{query}/{author}/{category}/{mediaType}/{color}/{resultPerPage}/{startElement}",
defaults: new
{
author = "none",
category = 0,
mediaType = 0,
color = 0,
resultsPerPage = 15,
startElement = 0
},
constraints: new
{
httpMethod = new HttpMethodConstraint("GET")
}
);
和Html.BeginRouteForm("SearchFormRoute")
。有时候设置了动作属性(但它不正确),有时候它是空的。
我真的不知道如何正确设置它。有没有办法将表单重定向到使用路由设置URL地址手动定义?
编辑:添加整个表单代码
我正在使用的表单代码:
Html.BeginRouteForm("Search_Search")
编辑:添加生成的表单代码
@using (Html.BeginForm("Search", "Search", FormMethod.Get))
{
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="input-group">
<div class="col-md-9 nopadding">
<input type="text" id="query" name="query" class="form-control navSearchInput" placeholder="search...">
</div>
<span class="input-group-btn">
<button class="navSearchButton" type="submit">
<i class="fa fa-search-plus"></i>
</button>
</span>
</div>
</div>
</div>
}
答案 0 :(得分:1)
如果您尝试访问/Search/Search
(仅此而已),您将获得404
因为您需要query
路由参数。因此,对/Search/Search
的任何请求都不会与路由匹配。
但/Search/Search?query=blah
形式的请求也是如此,因为您的路由要求query
是路由参数,而此处query
来自查询字符串。再次,404
。
要获得您想要的内容,您必须使用Javascript来处理表单提交,并确保query
是路由的一部分。类似的东西:
$("formIdHere").on("submit", function () {
this.action += WHATEVER_YOU_WANT_TO_ADD;
this.submit();
});