如何检测和拒绝向MVC控制器发送的非JavaScript帖子
有没有一种简单的方法可以检测并拒绝向MVC控制器发送的非JavaScript帖子 假设我有一些JavaScript通过Ajax提交表单:如何检测和拒绝向MVC控制器发送的非JavaScript帖子,javascript,asp.net-mvc,jquery,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;
function SubmitForm()
{
var data = $("form").serialize();
$.post("/MyController/MyAction/", data, function(data, response){
//Process response
});
return false;
}
如果用户禁用JavaScript,表单仍将通过标准表单post发布到控制器。我知道我不能停止它的发布,但是我可以检测并拒绝来自控制器的非JavaScript发布,并将用户发送到错误页面吗
我也知道这可能不是控制器功能的标准部分,所以我想知道是否有人想出了实现这一点的窍门。在控制器中检查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");
if(!Request.IsAjaxRequest)返回RedirectToAction(“YourBankedAction”)代码>将表单方法设置为“get”如何?然后,您可以在服务器端轻松地检测该方法,并且仅当该方法是post时才进行处理
<form method="get">
...
</form>
...
编辑:选中serialize()函数docs,它实际上并不要求您的输入在表单中。只要您有选择它们的方法,例如一个封闭的div。这也是一个选项。您可以使用JavaScript向表单添加一个特定的隐藏输入:
$('#your_form').append('<input type="hidden" name="got_js" value="1"/>');
您应该在控制器操作上使用ActionFilter
[仅限AjaxOnly]
公共操作结果AjaxActionMethod()
{
....
}
这不是现成的,所以你需要自己写。你可以找到一个很好的例子嘿,谢谢你的快速回复,不过我更喜欢Asp.NET-MVC特定的答案:-)是的,很抱歉,我实际上还在学习Asp.NET,所以谢谢@balexandre的edit.omg!非常感谢!我没有意识到事情会这么简单:-)嘿@mu太短了-谢谢你的回答-我本来想沿着这条路走,但似乎有一些更简单的方法-看看@Tahbaza的答案不管怎样,我只是增加了更多的选择。我猜Tahbaza只是围绕派拉蒙的HTTP\u X\u REQUESTED\u的ASP.net包装,带有头检查,总是很好地了解所有包装下面的内容。不过,我认为这是另一个问题的正确答案,如何检测服务器端启用的js。。。我认为你的代码加上在文档的onReady上调用$(“你的表单”).submit()就可以了。我收回这一点。我想我觉得这很奇怪,因为我通常根本不会将要发布的输入放在表单中,而是将输入拉到javascript对象中并作为json发布。必须离开我自己的小世界:-)
var data = $("form").serialize();
data = data ? data + '&got_js=1' : 'got_js=1';