Отправка данных JSON, содержащих массив, в действие контроллера - PullRequest
1 голос
/ 02 апреля 2012

В приложении ASP.NET MVC3 я пытаюсь использовать jQuery для создания асинхронной публикации в действии.

Следующий объект JSON передается как данные ...

{
    categoryId: "21"
    content: "asdf"
    reference: "asdf"
    tags: [
        {id: 1, name: "asdf", status: 1},
        {id: 2, name: "asdf", status: 1},
        {id: 3, name: "asdf", status: 1}
    ]
}

Подпись метода, которую я должен получить:

[HttpPost]
public ActionResult Create(String reference, Int32? categoryId, String content, IEnumerable<TagDTO> tags)

с TagDTO определяется как:

public class TagDTO
{
    public String name { get; set; }
    public Int32 id { get; set; }
    public Int32 status { get; set; }
}

Я должен упомянуть, что до того, как я ввел массив объектов в объект JSON и в сигнатуру метода действия, это работало отлично. И Почта все еще успешно достигает действия, только данные в IEnumerable не проходят правильно. Это даст мне правильное количество объектов в IEnumerable, но все они инициализируются значениями по умолчанию. (id = 0, name = null, status = 0)

Я не уверен, что я делаю здесь не так. Я надеюсь это имеет смысл. Я надеюсь, что кто-то может показать мне правильный способ передачи данных в действие MVC таким образом.

Спасибо


Вот функция javascript, которую я использую для выполнения своего вызова ajax ...

function saveResource() {
    var tagAssignments = [];
    for (var x = 0; x < $('.tag-assignment').length; x++) {
        var tag = $($('.tag-assignment')[x]);
        tagAssignments.push({
            name: tag.find('.tag-name').html().toString(),
            id: parseInt(tag.find('.tag-id').html()),
            status: parseInt(tag.find('.tag-status').html())
        });
    }

    $.ajax({
        url: '/Resources/Create',
        dataType: 'json',
        type: 'POST',
        success: function (data) {
            if (data.status == 'Success') {
                forwardToDefaultPage();
            } else {
                alert(data.status);
            }
        },
        data: {
            reference: $('#txt-resource-reference').val(),
            categoryId: $('#ddl-category').val(),
            content: $('#txt-resource-content').val(),
            tags: tagAssignments
        }
    });
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Я бы порекомендовал вам использовать модели представления и отправить запрос JSON.

Итак, модель представления:

public class CreateViewModel
{
    public string Reference { get; set; }
    public int? CategoryId { get; set; }
    public string Content { get; set; }
    public IEnumerable<TagDTO> Tags { get; set; }
}

action:

[HttpPost]
public ActionResult Create(CreateViewModel model)
{
    ...
}

AJAX-запрос:

// TODO: build this object dynamically as you are currently doing
// but always start with hardcoded values like this to test first
var data = {
    categoryId: '21',
    content: 'asdf',
    reference: 'asdf',
    tags: [
        { id: 1, name: 'asdf', status: 1 },
        { id: 2, name: 'asdf', status: 1 },
        { id: 3, name: 'asdf', status: 1 }
    ]
};

$.ajax({
    url: '@Url.Action("create", "resources")',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({ model: data }),
    success: function(result) {
        ...
    }
});

Используемый здесь метод JSON.stringify встроен в современные браузеры.Если вам нужна поддержка старых браузеров, вы можете добавить скрипт json2.js на свою страницу.

0 голосов
/ 02 апреля 2012

Несколько вещей, чтобы попробовать.

Посмотрите, как перейти к вызову ajax, как показано ниже.

function saveResource() {

   var tagAssignments = [];
   for (var x = 0; x < $('.tag-assignment').length; x++) {
       var tag = $($('.tag-assignment')[x]);
       tagAssignments.push({
           name: tag.find('.tag-name').html().toString(),
           id: parseInt(tag.find('.tag-id').html()),
           status: parseInt(tag.find('.tag-status').html())
       });
   }

   $.ajax({
       url: '<%: Url.Action("Create", "Resources")',
       dataType: 'json',
       type: 'POST',
       success: function (data) {
           if (data.status == 'Success') {
               forwardToDefaultPage();
           } else {
               alert(data.status);
           }
       },
       data: {
           reference: $('#txt-resource-reference').val(),
           categoryId: $('#ddl-category').val(),
           content: $('#txt-resource-content').val(),
           tags: JSON.stringify(connect)        
       }
   });

}

и измените свой IEnumerable на IListваше действие

   [HttpPost]
   public ActionResult Create(String reference, Int32? categoryId, String content, IEnumerable<TagDTO> tags)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...