1

URL の末尾にある「.json」または「.xml」を検出するようにルーティングを設定することはできますか? アクションメソッドにパラメーターを追加することで、そのパラメーターを読み取れないようにすることは可能ですか? この目的でクエリ文字列を使用するのではなく、醜いように思えます。

MyWebsite/Controller/MyAction.json

MyWebsite/Controller/MyAction.xml

MyWebsite/Controller/MyAction.otherType

--- 

public ActionResult MyAction()
{
   var myData = myClient.GetData();
   return SerializedData(myData);
}

private ActionResult SerializedData(Object result)
{
   String resultType = SomeHowGetResultTypeHere;

   if (resultType == "json")
   {
      return Json(result, JsonRequestBehavior.AllowGet);
   }
   else if (resultType == "xml")
   {
      return new XmlSerializer(result.GetType())
          .Serialize(HttpContext.Response.Output, sports);
   }
   else
   {
      return new HttpNotFoundResult();
   }
}
4

1 に答える 1

1

正確にはあなたが求めたものではありませんが、うまくいきます...最初にルート設定でこれをデフォルトルートの上に追加します(重要):

routes.MapRoute(
    name: "ContentNegotiation",
    url: "{controller}/{action}.{contentType}",
    defaults: new { controller = "Home", action = "MyAction", contentType = UrlParameter.Optional }
);

URL のドットを処理するには、セクション system.webServer > handlers で Web.config を変更して、次の行を追加する必要があります。

<add name="ApiURIs-ISAPI-Integrated-4.0" path="/home/*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

この新しいハンドラーは、先頭に /home/* があるすべての URL で機能しますが、必要に応じて変更できます。

あなたのコントローラーよりも:

public ActionResult MyAction(string contentType)
{
    return SerializedData(new { id = 1, name = "test" }, contentType);
}

このアプローチでは MyAction のパラメーターを使用しますが、次のように呼び出すことができます。

MyWebsite/Controller/MyAction.json

このようではない

MyWebsite/Controller/MyAction?contentType=json

あなたが求めたものは何ですか。

于 2013-03-03T21:08:36.597 に答える