如何检测和拒绝非JavaScript帖子到MVC控制器

时间:2011-04-17 02:52:28

标签: javascript asp.net-mvc jquery

我是否有一种简单的方法可以检测并拒绝向MVC控制器发送非JavaScript帖子?

假设我有一些JavaScript通过Ajax提交表单:

function SubmitForm()
{
   var data = $("form").serialize();

   $.post("/MyController/MyAction/", data, function(data, response){
       //Process response
   });

   return false;
}

如果用户禁用JavaScript,表单仍会通过标准表单发布到控制器。我知道我无法阻止发布,但是我可以检测并拒绝来自控制器的非JavaScript帖子并将用户发送到错误页面吗?

我也明白,这可能不是Controller功能的标准部分,所以我想知道是否有人想出了实现这一目标的技巧。

5 个答案:

答案 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

相关问题