Asp.net mvc 使用Html.BeginForm()时保留get参数

Asp.net mvc 使用Html.BeginForm()时保留get参数,asp.net-mvc,parameters,Asp.net Mvc,Parameters,使用Html.BeginForm()执行GET请求时,是否可以保留GET参数。我不想输入任何硬编码视图和控制器 当我尝试 @using (Html.BeginForm()) @using (Html.BeginForm(null, null, FormMethod.GET)) 它保留了我的GET参数(排序、页面、sortdir等)。但它正在发布我的情妇+ 当我尝试 @using (Html.BeginForm()) @using (Html.BeginFor

使用Html.BeginForm()执行GET请求时,是否可以保留GET参数。我不想输入任何硬编码视图和控制器

当我尝试

    @using (Html.BeginForm())
    @using (Html.BeginForm(null, null, FormMethod.GET))
它保留了我的GET参数(排序、页面、sortdir等)。但它正在发布我的情妇+

当我尝试

    @using (Html.BeginForm())
    @using (Html.BeginForm(null, null, FormMethod.GET))
参数被重置,我只有使用表单发送的新GET参数

这个问题的解决方案是什么?:)

这个问题的解决方案是什么?:)

要编写自定义Html.BeginForm帮助程序,该帮助程序将按照您的需要运行:

using System;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;

public static class FormExtensions
{
    public static IDisposable MyBeginForm(this HtmlHelper html, string action, string controller, FormMethod method)
    {
        var routeValues = new RouteValueDictionary();
        var query = html.ViewContext.HttpContext.Request.QueryString;
        foreach (string key in query)
        {
            routeValues[key] = query[key];
        }
        return html.BeginForm(action, controller, routeValues, FormMethod.Get);
    }
}
然后在视图中使用此自定义辅助对象而不是默认辅助对象:

@using (Html.MyBeginForm(null, null, FormMethod.Get))
{ 
    ...
}
如果您不想编写自定义帮助程序(不推荐),您还可以编写以下代码来捕获当前查询字符串参数,从而损害视图:

@using (Html.BeginForm(null, null, new RouteValueDictionary(Request.QueryString.Keys.Cast<string>().ToDictionary(key => key, key => (object)Request.QueryString[key])), FormMethod.Get))
{ 
    ...    
}
@使用(Html.BeginForm(null,null,newRouteValueDictionary(Request.QueryString.Keys.Cast().ToDictionary(key=>key,key=>(object)Request.QueryString[key]))FormMethod.Get))
{ 
...    
}
这个问题的解决方案是什么?:)

要编写自定义Html.BeginForm帮助程序,该帮助程序将按照您的需要运行:

using System;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;

public static class FormExtensions
{
    public static IDisposable MyBeginForm(this HtmlHelper html, string action, string controller, FormMethod method)
    {
        var routeValues = new RouteValueDictionary();
        var query = html.ViewContext.HttpContext.Request.QueryString;
        foreach (string key in query)
        {
            routeValues[key] = query[key];
        }
        return html.BeginForm(action, controller, routeValues, FormMethod.Get);
    }
}
然后在视图中使用此自定义辅助对象而不是默认辅助对象:

@using (Html.MyBeginForm(null, null, FormMethod.Get))
{ 
    ...
}
如果您不想编写自定义帮助程序(不推荐),您还可以编写以下代码来捕获当前查询字符串参数,从而损害视图:

@using (Html.BeginForm(null, null, new RouteValueDictionary(Request.QueryString.Keys.Cast<string>().ToDictionary(key => key, key => (object)Request.QueryString[key])), FormMethod.Get))
{ 
    ...    
}
@使用(Html.BeginForm(null,null,newRouteValueDictionary(Request.QueryString.Keys.Cast().ToDictionary(key=>key,key=>(object)Request.QueryString[key]))FormMethod.Get))
{ 
...    
}

我尝试了这两种解决方案,当鼠标悬停在submit按钮上时,它会显示其提交到的正确url,但在我提交时,它会重定向到错误的url,并且仅使用我提交的参数。您认为使用这种方式如何:foreach(请求中的var key.QueryString.Keys.Cast(){if(key!=“searchtxt”){@Html.Hidden(key,Request.QueryString[key])}?当您浏览提交按钮时,如果这确实是一个提交按钮,则不应显示任何url:
确定
。查看生成的HTML和表单的action属性,以查看正确的url。如果您正在使用一些锚或javascript来修改此操作,那么这将是一个完全不同的故事。但是我展示的代码在考虑了查询字符串参数的情况下生成了正确的操作。我尝试了两种解决方案,当鼠标悬停在提交按钮上时,它会显示提交到的正确url,但当我提交时,它会重定向到错误的url,并且仅使用我提交的参数。您认为如何使用这种方式:foreach(Request.QueryString.Keys.Cast()中的var key){if(key!=“searchtxt”){@Html.Hidden(key,Request.QueryString[key])}?当您浏览提交按钮时,如果这确实是一个提交按钮,则不应显示任何url:
确定
。查看生成的HTML和表单的action属性以查看正确的url。如果您使用一些锚或javascript来修改此操作,则这是一个完全不同的故事。但代码显示的ave将生成正确的操作,并考虑查询字符串参数。