【发布时间】:2010-10-03 16:47:39
【问题描述】:
JsonResult 类是一种通过 AJAX 将 Json 作为操作返回给客户端的非常有用的方法。
public JsonResult JoinMailingList(string txtEmail)
{
// ...
return new JsonResult()
{
Data = new { foo = "123", success = true }
};
}
但是(至少根据我的第一印象)这确实不是一个很好的关注点分离。
- 单元测试方法更难编写,因为它们没有很好的强类型数据来测试并且必须知道如何解释 Json。
- 未来不通过 HTTP(或任何涉及序列化的远程协议)的其他视图更难被“插入”,因为在这种情况下不需要序列化和反序列化响应。
- 如果您有两个不同的地方需要该操作的结果怎么办?一个想要 Json,另一个想要 XML,或者可能是一个完全 or partially 呈现的视图。
我想知道为什么对象和 Json 之间的转换不是通过属性以声明方式实现的。在下面的代码中,您实际上是在告诉 MVC this method is convertible to Json,然后如果它是从 AJAX 客户端调用的,则会检查内部执行的 new JsonResult() 转换属性。
单元测试可以只取action结果(ObjectActionResult),拉出强类型的Foo。
[JsonConvertible]
public ActionResult JoinMailingList(string txtEmail)
{
// ...
return new ObjectActionResult()
{
Data = new Foo(123, true)
};
}
我只是好奇人们的想法和任何其他可以遵循的模式。
这些也只是我最初的观察——这可能不是一个理想的设计可能还有更多的原因(可能还有很多原因为什么它是一个完全可以接受和实用的设计!)我今晚只是感觉理论和魔鬼的拥护者。
* 免责声明:我什至还没有开始考虑该属性将如何实现或它可能具有的副作用或反作用等。
【问题讨论】:
-
就是我的想法。鉴于权力,我会为这个问题投票 5 次!
-
这是 MVC3 中的一个有效问题。但是,在较新的 MVC4 中,任何
ApiController操作方法都会自动评估AcceptHTTP 标头并相应地返回 JSON 或 XML。 action 方法只需要返回一个视图模型,这一切都是自动发生的,这使得单元测试再次变得容易!
标签: asp.net-mvc json design-patterns