Очень важно предупредить, даже в MVC3, о том, как работает MVC3.
Если вы передаете объект, как говорят:
{
Test: 'Hi'
}
И принимающий класс:
public class MyModel
{
public string Test { get; set; }
}
С методом контроллера принимающем как:
[HttpPost]
public JsonResult Submit(MyModel model)
{
. . .
Он будет работать. Но если ваш метод контроллера имеет это очень незначительное, казалось бы, безобидное изменение:
[HttpPost]
public JsonResult Submit(MyModel test)
{
. . .
Это не удастся. Это связано с тем, что структура MVC использует JSON в словаре, как упоминалось выше, и видит, что один из параметров имеет одно и то же имя, не учитывающее регистр, как один из его ключей («Тест»/«тест»). Затем он берет строковое значение «Привет», назначенное Test, и передает это аргументу «тест», хотя это явно не то, что автор намеревался.
Что является наиболее проблематичным в этом вопросе, так это то, что в фреймворке не возникает ошибка, пытающаяся присвоить строку аргументу типа MyModel, что, по крайней мере, даст вам представление о том, что пошло не так. Он не видит, что это был неправильный тип и отказ от его альтернативного поведения (которое он преследовал бы, если бы эти аргументы/свойства не соответствовали имени). Он просто терпит неудачу, и присваивает значение null вашему аргументу, оставляя вас без подсказки относительно того, что происходит.
Я неоднократно сталкивался с этой проблемой и, наконец, обнаружил сбой, который заставляет вещи случайно перестать работать в MVC ... Надеюсь, это поможет кому-то другому.
Поскольку любое разумное имя для этого аргумента действия является потенциально разумным именем свойства (модель, данные и т. Д.), А так как оно нечувствительно к регистру, самый безопасный способ предотвратить его без написания собственного связующего устройства - стандартизировать его, сумасшедший, очень-вряд ли к когда-либо-свойство-имя-быть имя аргумента, например:
[HttpPost]
public JsonResult Submit(MyModel _$_$twinkleTwinkleLittleFuckIt)
{
Но если у вас есть время, исправить ModelBinder/JsonValueProviderFactory так что 0 рисков вместо того, что один странного ошибка в течение десятилетия никто не может получить до дна.
Хм, это на самом деле не так. Объектом JSONified является строка. Между строкой, которую я отправляю, и JSONified-объектом с членом с именем «languageTag» нет. – JamesBrownIsDead
@JamesBrownIsDead - На самом деле, как я понимаю, есть разница. Взгляните на мой ответ ниже. – kdawg