2011-09-30 26 views
2

我不知道這是否是接近某件事的正確方法,但我希望是這樣。下面的例子是一個沉重的控制器,絕對是錯誤的方法,但它得到了我正在尋找的想法。如何使ASP.NET MVC Action返回不同的格式?

public class PeopleController : Controller 
{ 
    public ActionResult List(string? api) 
    { 
     MyViewModel Model = new MyViewModel(); 

     if (api == "json") { 

      // I'd like to return the Model as JSON 

     } else if (api == "XML") { 

      // I'd like to return the Model as XML 

     } else { 

      return View(Model); 
     } 
    } 
} 

現在我需要能夠做的是模型返回查看,如果它被要求這樣

http://example.com/People/List

但是我也喜歡輸出JSON如果這樣要求的話

http://example.com/People/List/?api=json

或者輸出XML,如果它的要求是這樣

http://example.com/People/List/?api=xml

這是完全錯誤的?
如果不是,那麼實現此目標的最佳方法是什麼?

我想用一個自定義MultiPurposeResult實現它,可以做所有的過濾爲我,然後返回它,因爲這

public class PeopleController : Controller 
{ 
    public MultiPurposeResult List(string? api) 
    { 
     MyViewModel Model = new MyViewModel(); 
     return MultiPurpose(Model);  } 
    } 
} 

編輯
的我發現這個博客裏面做同樣的方法,因爲我的第一個代碼塊。
http://shouldersofgiants.co.uk/Blog/post/2008/10/16/Creating-a-RESTful-Web-Service-Using-ASPNet-MVC-Part-5a-e28093-HTTP-Response-Codes.aspx

+0

作爲一個側面說明,'MultiPurposeResult'是不是最好的名字......我喜歡要知道什麼是適當的結果名稱應該是...我似乎總是在命名上掙扎。 –

+0

也許'RestActionResult'是一個更好的名字? –

回答

5

同意@Matt。不要明確地要求響應類型,內容類型推斷它在請求中,這是更加RESTful。

例如,創建了一個基本枚舉類型封裝你想要的響應類型:

public enum RestfulResultType 
{ 
    Json, 
    Html, 
    Xml 
} 

然後比套在你的行動創建一個自定義的模型綁定這一特性,根據內容類型。

那麼你的控制器看起來是這樣的:

public ActionResult List(RestfulResultType resultType) 
{ 
    var data = repo.GetSomeData(); 

    switch (resultType) 
    { 
     case RestfulResultType.Json: 
     return Json(data); 
     case RestfulResultType.Xml: 
     return XmlResult(data); // MvcContrib 
     case RestfulResultType.Html: 
     return View(data); 
    } 
} 

如果您需要任何更多的定製比普通的助手提供,然後創建自定義ActionResult的。

您可以將返回類型保留爲ActionResult - 這就是要點,以便控制器可以返回不同的格式。

ResfulResultTypeModelBinder.cs

public class ResfulResultTypeModelBinder: IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    if (controllerContext.HttpContext.Request.ContentType == "application/json") 
     return RestfulResultType.Json; 
    // other formats, etc. 
    } 
} 

的Global.asax:

ModelBinders.Binders.Add(typeof(RestfulResultType), new RestfulResultTypeModelBinder()); 
+0

我喜歡這個,除了我不想爲每個ActionResult(我在應用程序中都有幾十個)寫一個開關......我想我仍然會創建一個自定義返回類型。你能詳細說一下'enum RestfulResultType'嗎? –

+0

@rock - 沒什麼大不了的。只是魔術弦的替代品。如果不是開關,那麼你如何返回不同的類型?你是什​​麼意思「每個ActionResult」?你的意思是每個「結果類型」(例如json,xml)。怎麼會有幾十個? – RPM1984

+0

在我寧靜的應用程序中,我有數十個動作...(對不起,不是ActionResults)。我不想爲每個Controller編寫每個Action的開關,我寧願寫一個Custom Result Type,然後將開關寫入它。 –

1

您可以創建自定義MultiPurposeResult但我個人從方法簽名失去string? api,而不是具有多用途尋找的Request["format"]存在,然後做什麼格式可以輸出測定結果因爲格式與ActionResult沒有任何關係,但更多的是響應的格式。

相關問題