我对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
的POSTusing(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我编辑了我的问题,以便其他人知道哪个是确切的问题。保留字为action
和controller
,即使是字符串参数,包含参数和控制器的url也是网站路由的保留字,因此会自动省略。
答案 0 :(得分:0)
我会回答我自己的问题,因为我可以弄清楚问题是什么。 Action
和controller
是保留字,未被visual studio突出显示。因此,当我尝试从查询字符串中读取时,它正在解析或读取保留字并隐藏参数。