ASP.NET MVC 3.0 FormCollection中的JQuery Post表单

时间:2012-01-25 14:43:35

标签: jquery asp.net-mvc-3 forms

我尝试将Jquery中的表单提交给Controller中的Action方法。 为此,我序列化我的表单并使用get方法。在控制器中,我收到我的表格作为字符串,如param1 = 1& param2 = 2 .... 有没有办法在我的Action Method中直接检索FormCollection而不是字符串。由于我的表单有很多复选框,因此我更容易将它放在formCollection中。

这是我的Jquery:

 var form = $("#CheckForm");
                    var formCollection = form.serialize();
                    $.post('@Url.Action("CheckSelection")', { clientId: clientId, policyId: policyId, countryCode: country, month: monthtoken[0] + '*' + monthtoken[1], formCollection: formCollection }, function () {
                        alert("formSubmit");
                    });

这是我的表格:

@using (Html.BeginForm("CheckSelection", "Check", FormMethod.Post, new { id = "CheckForm" }))
{        
<fieldset>
<div class="editor-label">
    @Html.CheckBox("CodeExist",true)
    @Html.Label("Check Code Existence")
</div>
<div class="editor-label">
    @Html.CheckBox("Mandatory",true)
    @Html.Label("Check Code Reccurence")
</div>
<div class="editor-label">
    @Html.CheckBox("Reccurence",true)
    @Html.Label("Check Mandatory Code")
</div>
}

这是我的行动方法:

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult CheckSelection(string clientId, string policyId, string countryCode, string month, FormCollection formCollection){}

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

var form = $("#CheckForm");
var formCollection = form.serialize();
$.post('@Url.Action("CheckSelection")', formCollection , function (data) {
    alert(data); //will alert form submitted
});

,控制器看起来像

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CheckSelection(FormCollection collection){
    return Content("form submitted");
}

有关FormCollection类的详细信息,请按照此link

进行操作

答案 1 :(得分:1)

因此,序列化表单非常适合将所有表单值传递给操作结果,但是使用序列化URL字符串会很麻烦,特别是当我已经使用FormCollection的名称/值组合时已经。我只是想通过jQuery而不是普通的表单提交来切换功能。为此,我编写了一个帮助函数,将序列化的表单转换为普通的表单集合,就像表单正常提交一样。

享受。

private FormCollection DeSerialize(FormCollection form)
{
  FormCollection collection = new FormCollection();
  //un-encode, and add spaces back in
  string querystring = Uri.UnescapeDataString(form[0]).Replace("+", " ");
  var split = querystring.Split(new [] {'&'}, StringSplitOptions.RemoveEmptyEntries);
  Dictionary<string, string> items = new Dictionary<string, string>();      
  foreach (string s in split)
  {        
    string text = s.Substring(0, s.IndexOf("="));
    string value = s.Substring(s.IndexOf("=")+1);

    if (items.Keys.Contains(text))
      items[text] = items[text] + "," + value;
    else
      items.Add(text, value);
  }
  foreach (var i in items)
  {
    collection.Add(i.Key, i.Value);
  }            
  return collection;
}

答案 2 :(得分:0)

我修改了上面@Aaron McCoy提供的方法来处理&#39;&amp;&#39;在输入中:

private FormCollection DeSerialize(string val)
{
FormCollection collection = new FormCollection();
//un-encode, and add spaces back in
var split = val.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> items = new Dictionary<string, string>();
foreach (string s in split)
{
var v = Uri.UnescapeDataString(s).Replace("+", " ");
string text = v.Substring(0, v.IndexOf("="));
string value = v.Substring(v.IndexOf("=") + 1);

if (items.Keys.Contains(text))
items[text] = items[text] + "," + value;
else
items.Add(text, value);
}
foreach (var i in items)
{
collection.Add(i.Key, i.Value);
}
return collection;
}

希望有所帮助!