Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Html.BeginForm带有route id参数并在提交时获取参数?_C#_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

C# Html.BeginForm带有route id参数并在提交时获取参数?

C# Html.BeginForm带有route id参数并在提交时获取参数?,c#,asp.net-mvc,asp.net-mvc-3,razor,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' 但是我有一个dropdownlist,它带有一个表单,可以对这个查询进行排序,然后再次将其发送回服务器以获得排序结果。

在我的mvc项目中,我有这样一种方法:

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

}
所以这个方法被称为:
'www.myweb.com/Categories/212'

但是我有一个dropdownlist,它带有一个表单,可以对这个查询进行排序,然后再次将其发送回服务器以获得排序结果。 我的观点是:

@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>
}
@使用(Html.BeginForm(新的{categoryId=Model.categoryId}))
{
@LabelFor(m=>m.Order,“排序依据”)
@Html.DropDownListFor(m=>m.Order,Model.productsortbyooptions,new{onchange=“this.form.submit();”)
好啊
}
我的问题是,我不知道如何格式化我的代码,使其在我的url中有类似的内容:
'www.myweb.com/Categories/213?Order=MinPrice'


执行此操作的选项有哪些?

表单的方法必须是
GET

@using (Html.BeginForm(new { categoryId = Model.CategoryId }, FormMethod.Get))
这样,在提交表单时,所有表单字段都将添加到URL中的查询字符串中

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

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


我找到了解决办法!而不是与
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> 

@LabelFor(m=>m.Order,“ordenar por”)
@Html.DropDownListFor(m=>m.Order,Model.productsortbyooptions,new{onchange=“this.form.submit();”)
好啊

这总是将我的表单操作设置为:
{Categories}/{categoryId}
,因为是一个
GET
,所以
Order
将被设置为我想要的查询参数

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

在routeconfig中

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 } });
    }
这工作对我来说没问题


我的英语很差。抱歉

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

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


然后,表单标签将生成GET请求,表单中的所有参数都将位于URL查询字符串中

是的。。。但是url上的代码是这样的:“www.mypage.com/Category/Categories?categoryId=231&Order=MinPrice”这不是我要找的第一个方法重载
BeginForm(object routeValues,FormMethod method)
不存在。只是为了澄清一下,这可以通过
Html.BeginForm
实现,在进入表单方法之前,您只需填写所有参数,即:
Html.BeginForm(“List”,“YourController”,new{categoryId=Model.categoryId},FormMethod.get)
。当然,我通常采取与您在类似场景中相同的方法,因为这稍微不那么困难,尽管您不需要
Url.Action()
位:
Action=“”
也可以工作。它不是这样工作的。。。因为它生成的url类似于:
'www.myweb.com/YourController/List?categoryId=123'
,并且该url不适用于我的方法上的路由配置:
[Route(“List/{categoryId”)]
如果您使用的是属性路由,您应该注释掉或删除
RouteConfig.cs
中的默认路由。然后,它就可以工作了。
@using (Html.BeginForm("MethodName", "YourController",FormMethod.Get))