Передача неструктурированного 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"