Html.BeginForm有路由id参数和get参数提交?

时间:2014-03-13 14:51:39

标签: c# asp.net-mvc asp.net-mvc-3 razor

我的mvc项目中有这样的方法:

[Route("Categories/{categoryId}")]
public ActionResult List(SearchQueryCommand searchQuery) {
    //Stuff
    return View();

}

因此,此方法称为:'www.myweb.com/Categories/212'

但是我有一个下拉列表,其中包含一个表单,可以对此查询进行排序并将其再次发送回服务器以获取排序结果。 我的剃刀观点中有这个:

@using (Html.BeginForm(new { categoryId = Model.CategoryId }))
{
                <div>
                    <small>@Html.LabelFor(m => m.Order, "sort by")</small>
                    @Html.DropDownListFor(m => m.Order, Model.ProductSortByOptions, new { onchange = "this.form.submit();" })
                    <button class="nojs" type="submit">ok</button>
                </div>
}

我的问题是我不知道如何格式化我的代码,以便在我的网址中添加:'www.myweb.com/Categories/213?Order=MinPrice'

我可以选择执行此操作吗?

4 个答案:

答案 0 :(得分:2)

表单的方法必须是GET

@using (Html.BeginForm(new { categoryId = Model.CategoryId }, FormMethod.Get))

这样,提交表单时,所有表单字段都将添加到URL中的查询字符串中。

要发布到特定操作方法,您需要在BeginForm定义中指定它们。我对基于属性的路由定义不太熟悉,但其中一个应该可以工作:

@using (Html.BeginForm("List", "Categories", new { categoryId = Model.CategoryId }, FormMethod.Get))

或者

@using (Html.BeginForm("Index", "Categories", new { categoryId = Model.CategoryId }, FormMethod.Get))

答案 1 :(得分:1)

我找到了解决方案!并且不在Html.BeginForm

我的代码是这样的:

<form action="@Url.Action()" method="get">
     <div>
        <small>@Html.LabelFor(m => m.Order, "ordenar por")</small>
        @Html.DropDownListFor(m => m.Order, Model.ProductSortByOptions, new { onchange = "this.form.submit();" })
        <button class="nojs" type="submit">ok</button>
     </div>
</form> 

这始终将我的表单操作设置为:{Categories}/{categoryId},因为是GETOrder将被设置为我想要的查询参数。

答案 2 :(得分:1)

我使用RedirectToRoute在beginform POST方法中路由params,这会生成302 http响应,但我不知道其他方法。

中的

routes.MapRoute(
           name: "list",
           url: "{bti}-e-{bop}-e-{blo}-e-{bzo}-e-{bpr}-e-{bha}-e-{bor}",
           defaults: new { controller = "home", action = "list", bpr = UrlParameter.Optional, bha = UrlParameter.Optional, bor = UrlParameter.Optional }
           );

行动得到:

public ActionResult li(int activepage = 0,  Buscador bu = null)
    {
    your code...
    return View(model);
    }

行动职位:

[HttpPost]
    public ActionResult li(int activepage = 0,Buscador bu = null)
    {
     ..my code to format values...
     ..send values below that interest me routing.. 
     return RedirectToRoute("list", new System.Web.Routing.RouteValueDictionary { { "bti", bu.bti }, { "bop", bu.bop }, { "blo", bu.blo }, { "bzo", bu.bzo }, { "bpr", bu.bpr }, { "bha", bu.bha }, { "bor", bu.bor } });
    }

这项工作对我来说还可以。

我的英语非常糟糕。遗憾

答案 3 :(得分:1)

您需要将方法GET添加到表单标记

@using (Html.BeginForm("MethodName", "YourController",FormMethod.Get))

{     ... }

然后您的Form标签将生成GET请求,表单中的所有参数将在URL查询字符串中。