为什么缺少MVC查询字符串?

时间:2015-06-15 20:03:03

标签: c# asp.net-mvc routes

我对MVC操作中的查询字符串有一个奇怪的问题。这就是我所拥有的:

首先,我有一个包含多个参数的动作:

public ActionResult Index(string p1, string p2, string action, string controller, string p5)
{
    if (!String.IsNullOrEmpty(p1) 
        && !String.IsNullOrEmpty(p2) 
        && !String.IsNullOrEmpty(action) 
        && !String.IsNullOrEmpty(controller) 
        && !String.IsNullOrEmpty(p5))
    {
         return View();
    }

    else
    {
        TempData["error"] = "Values missing";
        return View();
    }
}

页面的URL如下所示: Home/Index?p1=1&p2=2&action=3&controller=4&p5=5

然后在视图中我发送一个带有简单beginform

的POST
using(Html.BeginForm("GetValues", "Home", FormMethod.Post))
{
    @Html.HiddenFor(m => m.p1, new{ Value = Request.QueryString["p1"] })
    @Html.HiddenFor(m => m.p2, new{ Value = Request.QueryString["p2"] })
    @Html.HiddenFor(m => m.action, new{ Value = Request.QueryString["action"] })
    @Html.HiddenFor(m => m.controller, new{ Value = Request.QueryString["controller"] })
    @Html.HiddenFor(m => m.p5, new{ Value = Request.QueryString["p5"] })
    @Html.HiddenFor(m => m.OtherField)

    <button type="submit">Send</button>
}
<script>
    $(function(){
       $.ajax({
       url: "/Home/OtherAction",
       type: "GET",
       cache: false,
       success: function(result){
            $("#OtherField").val(result.OtherField);
      }
      });
    });
</script>

在我发布值后,我会在我的其他操作中收到它们:

public ActionResult GetValues(ViewModel model)
{
    if(ModelState.IsValid)
    {
         //I execute my code
    }
    else
    {
         //I have the p1,p2,action,controller,p5 correctly and OtherField is null, so I return to the Index action with the parameters I HAVE CORRECTLY
         return RedirectToAction("Index", "Home", new{ p1 = model.p1, p2 = model.p2, action = model.action, controller = model.controller, p5 = model.p5})
    }
}

从技术上讲,我使用相同的参数再次重定向到Index,视图正确返回但页面完成加载时。 我错过了参数action and controller,即使我验证if是null还是空并且我没有问题(因为动作参数中的值很好)。问题是在浏览器中我错过了查询字符串。

最终结果: Home/Index?p1=1&p2=2,p5=5

由于

更新:感谢@Stephen Muecke我编辑了我的问题,以便其他人知道哪个是确切的问题。保留字为actioncontroller,即使是字符串参数,包含参​​数和控制器的url也是网站路由的保留字,因此会自动省略。

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题,因为我可以弄清楚问题是什么。 Actioncontroller是保留字,未被visual studio突出显示。因此,当我尝试从查询字符串中读取时,它正在解析或读取保留字并隐藏参数。