1

是否可以以在我的网址末尾检测到“.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 回答