我是否有一种简单的方法可以检测并拒绝向MVC控制器发送非JavaScript帖子?
假设我有一些JavaScript通过Ajax提交表单:
function SubmitForm()
{
var data = $("form").serialize();
$.post("/MyController/MyAction/", data, function(data, response){
//Process response
});
return false;
}
如果用户禁用JavaScript,表单仍会通过标准表单发布到控制器。我知道我无法阻止发布,但是我可以检测并拒绝来自控制器的非JavaScript帖子并将用户发送到错误页面吗?
我也明白,这可能不是Controller功能的标准部分,所以我想知道是否有人想出了实现这一目标的技巧。
答案 0 :(得分:6)
if (!Request.IsAjaxRequest) return RedirectToAction("YourForbiddenAction");
答案 1 :(得分:1)
如何将表单方法设置为“get”?然后,您可以在服务器端轻松检测该方法,并仅在方法发布时进行处理。
<form method="get">
...
</form>
编辑:检查了serialize()函数文档,它实际上并不要求您的输入位于表单内。只要你有办法选择它们,比如一个封闭的div。所以这也是一个选择。
答案 2 :(得分:1)
您可以使用JavaScript向表单添加特定的隐藏输入:
$('#your_form').append('<input type="hidden" name="got_js" value="1"/>');
然后,在服务器上,您可以检查是否有got_js
参数。如果没有,那么您可能正在处理某些没有JavaScript支持的人。您可以在SubmitForm
函数中执行相同操作,方法是向data
添加其他内容:
var data = $("form").serialize();
data = data ? data + '&got_js=1' : 'got_js=1';
答案 3 :(得分:0)
在你的控制器中检查jquery用ajax请求发送的头文件。
if($_SERVER['HTTP_X_REQUESTED_WITH'] !='XMLHttpRequest'){
die();
}
编辑:刚才意识到你不是在使用PHP而是使用asp.net。你应该能够做同样的事情。
由balexandre
添加if( Request.ServerVariables["HTTP_X_REQUESTED_WITH"].ToLower() != "xmlhttprequest" )
return RedirectToAction("Failed");
但在.NET中有更好的方法:
if( !Request.IsAjaxRequest )
return RedirectToAction("Failed");
答案 4 :(得分:0)
您应该在控制器操作上使用ActionFilter。
[AjaxOnly] public ActionResult AjaxActionMethod() { .... }
这不是开箱即用的,所以你需要自己编写。你可以找到一个很好的例子here