Класс JsonResult - очень полезный способ вернуть Json в качестве действия для клиента через AJAX.
public JsonResult JoinMailingList(string txtEmail)
{
// ...
return new JsonResult()
{
Data = new { foo = "123", success = true }
};
}
Однако (по крайней мере, по моему первому впечатлению) это действительно не хорошее разделение проблем.
- Unit test методы сложнее писать, потому что у них нет хороших строго типизированных данных для тестирования и они должны знать, как интерпретировать Json.
- Это сложнее для некоторых других представлений в будущем, которые не связаны с HTTP (или любым удаленным протоколом, включающим сериализацию), чтобы быть "подключенным", потому что его ненужным в таких случаях является сериализация и десериализация ответа.
- Что делать, если у вас есть два разных места, которые нуждаются в результатах этого действия? Один хочет Json, а другой хочет XML или, возможно, полностью или частично визуализированное представление.
Мне интересно, почему трансляция между объектом и Json не была реализована декларативно через атрибут. В приведенном ниже коде вы, по существу, указываете MVC, что this method is convertible to Json
, а затем, если он вызывается из клиента AJAX, выполняется проверка для атрибута new JsonResult()
, выполненное внутренне.
Единичное тестирование может просто принять результат действия (ObjectActionResult
) и вытащить строго типизированный Foo
.
[JsonConvertible]
public ActionResult JoinMailingList(string txtEmail)
{
// ...
return new ObjectActionResult()
{
Data = new Foo(123, true)
};
}
Мне было просто любопытно относиться к мыслям людей и к любой альтернативной схеме.
Это также мои первоначальные наблюдения - вероятно, есть еще больше причин, почему это не идеальный дизайн (и, вероятно, много причин, почему его вполне приемлемый и практичный!) Я просто чувствую теоретическую и бесовскую защиту сегодня вечером.
* Отказ от ответственности: я даже не задумывался о том, как будет реализован атрибут или какие побочные эффекты или рекурсии и т.д. он может иметь.