在控制器端获取 Json 数据的空值

Getting null for Json data on controller side

我有这个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 参数为空。我尝试将表单的 enctype 设置为任何可能的值,我什至尝试 appication/json 按照 this W3C document 无济于事。当我在提交之前查看隐藏元素的值时,我看到它是这样的:

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

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

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

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