Mvc 3 публикует тип контента application / json, аргументы метода действия не отображаются? - PullRequest
3 голосов
/ 13 июня 2011

У меня интересная ситуация, которая поставила меня в тупик. Кажется, что публикация appliction/json типа контента делает базовый механизм маршрутизации неспособным связывать аргументы метода действия.

Использование маршрута по умолчанию:

Routes.MapRoute(
  "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

У меня есть метод действия, который выглядит следующим образом:

//Controller name: TestController
[HttpPost]
public ActionResult SaveItem(int id, JsonDto dto)
{
  // if content type of the request is application/json id = 0, JsonDto is populated
  // if content type of the request is application/x-www-form-urlencode id = 1
}

Я публикую на этот URL /Test/SaveItem/1 + объект json.

Причина, по которой мне нужно id и JsonDto, заключается в том, что аргумент id ссылается на родительский объект, к которому должен * JsonDto обратиться объект.

Полагаю, я мог бы изменить dto, чтобы он содержал родительский id в качестве свойства, и обойти всю эту проблему.

Мне кажется странным, что аргумент id не заполняется, когда я отправляю запрос application/json.

Ответы [ 2 ]

4 голосов
/ 13 июня 2011

ОК, вы не показали, как вы вызываете это действие, поэтому мы можем только догадываться здесь. Вот пример чего-то, что отлично работает для меня и позволяет заполнить все как и ожидалось в методе SaveItem:

Модель:

public class JsonDto
{
    public string Foo { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult SaveItem(int id, JsonDto dto)
    {
        return Content("success", "text/plain");
    }
}

Индекс:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("SaveItem", new { id = 123 })',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({
            foo: 'bar'
        }),
        success: function (result) {
            // TODO: handle the results
        }
    });
</script>
0 голосов
/ 14 июня 2011

Я выяснил свою проблему.

Проблема в том, что данные Json, которые публикуются в методе действия, содержат свойство Id

, в дополнение к id значение маршрута из маршрута по умолчанию.Поэтому при связывании объекта JSON

его свойство Id превосходит значение маршрута в URL-адресе.Так, чтобы настроить пример Дарина:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("SaveItem", new { id = 123 })',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({
            "Id": 456
        }),
        success: function (result) {
            // TODO: handle the results
        }
    });
</script>

Когда метод действия работает, аргумент int id содержит 456, а не 123, как ожидал I

(очевидно, ошибочно).

Таким образом, обходной путь для меня состоял в том, чтобы изменить мой маршрут по умолчанию на:

Routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{urlId}", // URL with parameters
  new { controller = "Home", action = "Index", urlId = UrlParameter.Optional } // 
);

Переименование параметра маршрута id по умолчанию на urlId и обновление моих методов действий решило конфликт

дляя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...