允许或不允许URL中的查询字符串?

时间:2012-10-31 15:35:49

标签: asp.net-mvc-3

如果没有选择任何值,我的视图有两个下拉列表和一个提交按钮,如果使用GET方法获取表单,那么我的网址将为http://localhost:53372/question/index?Index=List&type=&stage=&mid=1&mod=5

但我正在使用带有OnActionExcuting()覆盖方法的ActionFilter。所以在提交表单后,网址就像http://localhost:53372/question/index?index=List&mid=1&mod=5

其他两个QueryString消失了吗?

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.QueryString["mid"] == null || filterContext.RequestContext.HttpContext.Request.QueryString["mod"] == null)
        {
            mid = Convert.ToString(HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Query)["mid"]);
            mod = Convert.ToString(HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Query)["mod"]);
            if (!string.IsNullOrEmpty(mid) || !string.IsNullOrEmpty(mod))
            {
                RouteValueDictionary redirecttargetDictionary = new RouteValueDictionary();
                NameValueCollection Qstr = null;
                if (filterContext.HttpContext.Request.RequestType == "GET")
                {
                    Qstr = HttpUtility.ParseQueryString(filterContext.HttpContext.Request.Url.Query);
                    foreach (string item in Qstr)
                    {
                        redirecttargetDictionary.Add(item, Qstr[item]);
                    }
                    if (Qstr["mid"] == null)
                    {
                        redirecttargetDictionary.Add("mid", mid);
                    }
                    if (Qstr["mod"] == null)
                    {
                        redirecttargetDictionary.Add("mod", mod);
                    }
                    filterContext.Result = new RedirectToRouteResult(redirecttargetDictionary);
                }
            }
        }           
    }

但如果我选择Dropdown值,则所有queryString都在URL中。

不允许使用没有值stage=&type=的QueryString?

1 个答案:

答案 0 :(得分:0)

默认情况下,MVC将数据作为查询字符串传递,除非您提交表单,在这种情况下查询字符串被捆绑为HttpRequest对象的一部分。您可以使用FormCollection对象直接访问查询字符串,也可以将其作为HttpRequest对象的一部分。访问查询字符串的最直接方法是通过FormCollection对象,如下所示     [HttpPost]     public ActionResult SubmitData(FormCollection表单)     {         foreach(var key in form.AllKeys)         {             开关(键)             {                 案例“阶段”:                     // 做一些工作                     打破;                 案例“类型”:                     //做更多的工作                     打破;              }         }         return RedirectToAction(“SomeAction”);     }

在某些情况下,我看到空查询字符串值会导致某些浏览器出现问题(我认为IE)。我建议用一个令牌填充你的DropDownList而不是没有值,比如“Select ...”和值为-1。

var dropDownList = new List<SelectListItem>();

dropDownList.Add(new SelectListItem{ Text = "Select", Value = "-1"} );

然后

@Html.DropDownList("stage", Model.Stages)

或类似的东西。

我希望这会有所帮助:)