Asp.net mvc 3 MVC 3使用修改后的查询字符串值重新加载当前页面

Asp.net mvc 3 MVC 3使用修改后的查询字符串值重新加载当前页面,asp.net-mvc-3,querystringparameter,Asp.net Mvc 3,Querystringparameter,背景: 我有一个MVC布局(主)视图,它使用@Html.RenderAction在左侧导航面板中显示一个下拉列表。此下拉列表将显示在网站的所有页面上。 下拉列表被包装在表单元素中,当下拉列表发生变化时,表单被发布 问题: 现在,表单发布后,我需要使用querystring中附加的下拉列表值重新加载当前页面的内容(用户当前所在的任何页面…)。这意味着替换先前选择的querystring中可能已经存在的值 例如: 用户导航到网站的主页: Url:/Home/?dropdownvalue=蓝色 此时,

背景:

我有一个MVC布局(主)视图,它使用@Html.RenderAction在左侧导航面板中显示一个下拉列表。此下拉列表将显示在网站的所有页面上。 下拉列表被包装在表单元素中,当下拉列表发生变化时,表单被发布

问题:

现在,表单发布后,我需要使用querystring中附加的下拉列表值重新加载当前页面的内容(用户当前所在的任何页面…)。这意味着替换先前选择的querystring中可能已经存在的值

例如:

  • 用户导航到网站的主页:
  • Url:/Home/?dropdownvalue=蓝色

    此时,下拉列表显示所选的“蓝色”。用户将下拉列表中的值更改为“红色”。我需要使用以下url重新加载页面-

    /主页/?下拉列表值=红色

  • 用户移动到站点中的另一个页面:
  • Url:/CustomerFavorite/?下拉菜单=红色

    将下拉列表中的值从“红色”更改为“绿色”

    “CustomerFavourite”页面应在querystring中重新加载“绿色”

    我为这篇冗长的文章道歉。但是,我想提供一些额外的信息来澄清这个问题


    谢谢。

    如果您使用jQuery,您可以创建一个函数,将所选值发布到列表中

    $(document).ready(function () {
      $("#ListId").change(function () {
        $.ajax({
        url: "CustomerFavorite/Edit",
        type: "POST",
        data: "colour=" + $("#ListId").val(),
        success: function (result) {
            //Code to update your page
            }
        },
        error: function () {
    
        }
      }
    

    您可以尝试使用包装下拉列表的表单的GET方法:

    @using (Html.BeginForm(null, null, FormMethod.Get))
    {
        @Html.Action("SomeActionThatRendersTheDropDown", "SomeController")
    }
    
    或者整个表单都被包装在动作中:

    @Html.Action("SomeAction", "SomeController")
    
    然后在javascript中订阅下拉列表的更改事件并触发表单提交:

    $(function() {
        $('#DropDownId').change(function() {
            $(this).closest('form').submit();
        });
    });
    

    由于您使用了GET请求,这将自动重新加载当前页面,并在查询字符串中发送下拉列表的值。

    感谢Darin为查询字符串的javascript操作提供了链接。但是,我想要一个服务器端解决方案,下面是我如何实现它的-

    public ActionResult _ColorSelection(ColorModel model)
    {
        string selectedColor = model.Color.Value;
    
        // Modify Querystring params...
    
        NameValueCollection querystring = 
                HttpUtility.ParseQueryString(Request.UrlReferrer.Query); // Parse QS
    
        // If Querystring contains the 'color' param, then set it to selected value
        if (!string.IsNullOrEmpty(querystring["color"]))
        {
            querystring["color"] = selectedColor;
        }
        else  // Add color key to querystring
        {
            querystring.Add("color", selectedColor);
        }
    
        // Create new url
        string url = Request.UrlReferrer.AbsolutePath 
                             + "?" + querystring.ToString();
    
        return Redirect(url); // redirect
    
    }
    

    我有你在代码中提到的确切设置,除了表单是通过Post提交的(不是Get)。因此,如果我将form方法更改为“Get”。。。我将丢失url中除下拉值以外的现有querystring参数。对吗?@andytech,没错。如果要保留现有查询字符串参数而不是调用
    .submit()
    来触发表单提交,则可以通过追加或修改包含下拉列表值的查询字符串参数来更改
    窗口.location.href
    。下面是一个关于在javascript中操作查询字符串的好帖子:Rikard。。。恕我直言..问题不是发布,而是重新加载页面用户当前正在使用修改的querystring值。不过,我确实使用了与您提到的类似的jQuery函数来提交我的表单。如果您从控制器返回一个视图而不是PartialView,我认为您将获得所需的查询字符串。