我可以让Razor使用某些表单输入作为表单操作URI的一部分吗?

时间:2015-11-19 11:28:07

标签: c# asp.net-mvc routing

使用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>
}

1 个答案:

答案 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(); 
});