2015-12-23 73 views
1

我想一个FormCollection发送到动作在我的控制器,但动作永远不会被击中。Ajax调用不打控制器动作

形式:

<form class="form-horizontal" role="form" id="TestForm" onsubmit="return false"> 
<div class="row"> 
    <div class="col-md-12"> 
     <div class="form-group"> 
      <input type="text" name="Blah1" /> 
      <input type="text" name="Blah2" /> 
     </div> 
     <input id="SubmitButton" type="submit" value="Submit" /> 
    </div> 
</div> 

的jQuery/AJAX:

$(document).ready(function() { 
    $("#SubmitButton").click(function() { 
     var form = $("#TestForm").serialize(); 


     $.ajax({ 
      url: "/Calculator/Post", 
      type: "POST", 
      data: form, 
      dataType: 'json', 
      success: function() { 
       alert("Success"); 
      }, 
      error: function() { 
       alert("Error"); 
      } 
     }); 
    }); 
}); 

控制器动作:

[HttpPost] 
public JsonResult Post(FormCollection form) 
{ 
    return Json(new { success = true }, JsonRequestBehavior.AllowGet); 
} 

出现这种情况是浏览器的唯一的事提醒错误信息。我是否错过了导致行动永远不会被打的东西?

回答

0

您的代码应该正常工作,因为发布在问题中。唯一的问题是看你是如何手动建立网址,有时可能会导致404问题取决于你当前的网址/页面。你应该使用Url.Action helper方法来构建您目前在该网页将采取不分建设的正确相对URL照顾的URL。

serialize()方法是不够好,把你的表单数据。它应该工作正常(继续尝试)。您无需拨打serializeArray,然后根据接受的答案建议将其串联起来!

如果你正在在外部js文件这个Ajax调用,您可以考虑基本URL传递给js文件,并以此作为在this answer描述建立相对URL到你的操作方法。

而且,在你的操作方法,你不需要到JsonRequestBehavior.AllowGet参数传递给Json方法,动作方法被标记为[HttpPost]

[HttpPost] 
public JsonResult Post(FormCollection form) 
{ 
    var item =form["Blah1"]; 
    return Json(new { success = true }); 
} 
+1

谢谢你这个答案。你是对的,它工作得很好,而不必使用'serializeArray()'。无论出于何种原因,手动url都会导致错误。 – Quiver

1

.serialize()方法以标准的URL编码表示法创建一个文本字符串。serializeArray()方法创建一个JavaScript对象数组,准备编码为JSON字符串。

var form = JSON.stringify($("#TestForm").serializeArray()); 
0

确保您的控制器的操作方法或方法的参数的数据类型与正在发布的变量的数据类型相同。

实施例:

这不会因为在控制器中的InsertScore方法接收炭作为回答数据类型,但我们正在发送“ABC”这不是一个字符,因为炭化长度为2字节,以便唯一“A”的工作或'ab'可以在这种情况下发送。

阿贾克斯帖子:

  $.ajax({ 
        type: 'POST', 
        url: '/Home/InsertScore', 
        data: { Email: Em, Row: i, Answer: 'age' } 
       }); 

控制器:

[HttpPost] 
    [WebMethod] 
    public void InsertScore(string Email ,string Row,char Answer) 
    { 
    //do something here 
    } 

正确的方法是。

阿贾克斯帖子:

 $.ajax({ 
       type: 'POST', 
       url: '/Home/InsertScore', 
       data: { Email: Em, Row: i, Answer: 'a' } 
      }); 

控制器:

[HttpPost] 
    [WebMethod] 
    public void InsertScore(string Email ,string Row,char Answer) 
    { 
     //do something here 
    }