在控制器端获取Json数据的null

时间:2016-05-18 11:49:51

标签: json asp.net-mvc submit html-form

我有这个HTML

<form action="/Cabinet/Inbox" id="frmCabinet" method="post"/>
     <input type="hidden" id="hdnSearchOptions" name="searchOptions" />
     <input onclick="inbox()"/>
</form>

我有一个函数,我从各种DOM元素中收集信息并将它们存储在包装器对象中,然后进行提交:

function inbox(){
  searchOptions={};
  searchOptions.SearchText=$('#txtSearch').val();
  $('#hdnSearchOptions').val(JSON.stringify(searchOptions));
  $('#frmCabinet').submit();
}

这是服务器端的收件箱方法:

public ActionResult(SearchOptions searchOptions){
   //code goes here
}


public class SearchOptions{
   public string SearchText{get;set;}
   //some more properties
}

当提交发生时,我为searchOptions参数获取null。我已尝试将表单的enctype设置为任何可能的值,我甚至根据this W3C document尝试appication/json无效。当我在提交之前查看隐藏元素的值时,我发现它是这样的:

<input type="hidden" id="hdnSearchOptions" name="searchOptions" value="{&quot;SearchText&quot;:&quot;&quot;}">

因此生成的JSON字符串似乎没问题。我还缺少什么?或者根本不可能这样做?

1 个答案:

答案 0 :(得分:0)

好的,这就是我最终做的事情。在确保无法使用普通表单提交表单编码“application / json”之后(与人们在许多SO线程中所说的相反)我决定使用Request.Form来访问在客户端构建的json对象。正如@Stephen Muecke所说,我有一个选项可以提供所有输入值作为参数,但是有很多领域的方法,我不想把我的动作方法弄得很多参数。实际上有一种比其他方法更好的方法,即将它传递到ViewModel中,但问题是,在我的情况下我不能这样做,因为我无法将单独的ViewModel传递给_layout(主)页面。所以最后是代码:

public ActionResult(){
  var searchOptionsJson = Request.Form["searchOptions"];
  if(!string.IsNullOrEmpty(searchOptionsJson))            
      SearchOptions searchOptions = JsonConvert.DeserializeObject<SearchOptions>(searchOptionsJson);
}