Передача неструктурированного JSON между действиями контроллера jQuery и MVC
Существует много полезной информации о привязке модели MVC.
Моя проблема связана с тем, что я пытаюсь избежать создания строго типизированных данных в моем приложении MVC, поскольку он в основном должен действовать как маршрутизатор данных.
В принципе, у меня есть набор полей на странице с "input" класса, который я могу собрать с помощью jQuery('.input')
, перебрать и добавить в объект javascript. Затем я отправляю это на свой MVC-контроллер ASP.NET:
var inputData = my_serialize( $('input');
$.ajax({
type:'POST',
url: '/acme/Ajax/CaptureInput',
dataType: "json",
data: { inputData: JSON.stringify(inputData) },
success: Page_Response_RegisterAndDeposit,
error: Page_AjaxError
});
На стороне С# у меня есть
public JsonResult CaptureInput(string inputDataAsJsonString)
{
JavaScriptSerializer JSON = new JavaScriptSerializer();
object inputData = JSON.DeserializeObject(inputDataAsJsonString);
Это похоже на расточительный уровень косвенности, я бы предпочел передать данные как contentType: application/json и CaptureInput принять object
или IDictionary
или даже dynamic
.
Ответы
Ответ 1
Вы можете использовать метод serializeArray. Предположим, что у вас есть форма, содержащая элементы ввода, которые могут быть любого типа, и вы хотите вызвать следующее действие контроллера:
public ActionResult CaptureInput(Dictionary<string, string> values)
{
...
}
здесь, как вы могли бы продолжить:
<script type="text/javascript">
var values = $('form').serializeArray();
var data = {};
$.each(values, function (index, value) {
data['[' + index + '].key'] = value.name;
data['[' + index + '].value'] = value.value;
});
$.ajax({
url: '@Url.Action("CaptureInput")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(data),
success: function (result) {
alert('success');
}
});
</script>
Ответ 2
Не совсем то, что вам нужно, но, возможно, решение этой проблемы даст вам частичное обходное решение, позволяя вам привязываться к простому оберточному объекту со встроенным словарем. Это может даже позволить связывать напрямую с Словарем. Не уверен...
Вам также может потребоваться явно указать заголовок json ContentType в вызове $.ajax
"Связывание модели JSON для IDictionary < > в ASP.NET MVC/WebAPI"