我有这个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="{"SearchText":""}">
因此生成的JSON字符串似乎没问题。我还缺少什么?或者根本不可能这样做?
答案 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);
}