在ASP.NET MVC中处理返回多种格式的最佳方法是什么

时间:2009-08-26 00:26:01

标签: ruby-on-rails xml asp.net-mvc json

Rails有一个很好的习惯用法,让你可以轻松地让一个动作方法根据客户端指定的格式返回正确格式化的数据(json,xml,只是数据)(或者从请求中推断出来。)看起来像这样......

respond_to do |format|
  format.html #edit.html.erb
  format.json {render :text=> <your json here>), :layout=> false}
  format.xml ...

end

在ASP.NET MVC中执行此操作的首选方法是什么?理想情况下,我希望框架以与Rails相同的方式工作(例如,能够返回为客户端指定的格式正确格式化的ViewData,或者从请求本身推断出的格式。)

Rails还允许您创建特定于每种类型的视图,使您有机会基本上将相同的数据返回到所有视图,并让它们正确处理数据格式化(因此您有一个构建xml的视图,另一个构建的视图json和另一个构建html)。这可能是ASP.NET MVC吗?事实上,这个模型似乎最好的目标是分离关注点imho,因为它让控制器返回与视图无关的数据,而我今天看到的大多数方法(包括上面的行“format.json ....:layout =&gt; false“)在控制器内部执行JSON转换,并在给定该格式请求的情况下将该数据直接返回给客户端。

无论如何......建议,想法,建议?

由于

1 个答案:

答案 0 :(得分:2)

在ASP.NET MVC中,控制器操作通常返回从ActionResult派生的对象,然后在生成响应流时由运行时调用。

开箱即用,您有几个类派生自ActionResult - ContentResult用于文本结果,ViewResult用于视图内容,JsonResult用于序列化对象层次结构为JSON,RedirectResult用于重定向,依此类推。

通常,您将模型传递给结果并让它决定如何生成结果,但它不必是相同的模型 - 如果需要,我可以将不同的对象传递给每个结果。

操作返回的具体结果类型不会被“烘焙”到操作的签名中 - 您可以轻松地将格式参数传递给您的操作,并让它生成并相应地返回不同的ActionResult:

public ActionResult ListProducts(string format)
{
    List<Product> products = ProductService.GetAllProducts();
    if (format == "JSON")
    {
        // eg., transform model for JSON consumption
        List<JsonProduct> jsonProducts = ProductService.ToJSON(products); 
        return Json(jsonProducts);
    }
    else if (format == "XML")
    {
        return new XmlResult(products);
    }

   // default is to return HTML from view, which expects List<Product> for model
   return View(products);

}

请注意,方法 // default is to return HTML from view, which expects List<Product> for model return View(products); Json()内置于控制器中,分别是返回View()JsonResult的便捷方法。 ViewResult是一个自定义XmlResult的示例,它接受一个对象,将其序列化为XML,然后将结果作为XML流返回。

该示例有点人为,但它表明控制器协调选择结果和构造/转换传递给该结果的模型的所有工作。控制器操作仍然应该是轻量级的,因此您可以将繁重的任务卸载到服务中,例如从业务层加载模型,或将一个模型中的对象转换为另一个模型中的对象,例如JSON消耗。