且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

自定义ASP.NET MVC路由到服务与QUOT;以.json" "&的.xml QUOT;样式的URL

更新时间:2022-10-18 15:38:08

  context.MapRoute(
    Api_default
    {}面积/ 1 / {控制器} {}格式,
    新{行动=索引,ID = UrlParameter.Optional});

可能是你想要的东西。然后,你可以只返回基于传入的参数不同的结果。

在一个API区的背景下,SearchController是这样的:

 公共类SearchController:控制器
{
    公众的ActionResult指数(字符串格式,SearchModel搜索)
    {
        VAR的结果= searchFacade.SearchStuff(搜索);        如果(format.Equals(XML))
            返回XML(结果);使用XmlResult或任何//
        如果(format.Equals(HTML))
            返回查看(结果);
        返回JSON(结果,JsonRequestBehavior.AllowGet);
    }
}

I have a search Api I'm working on that needs to return search results in a block of Html (using styles the client has defined on their end). I would also like to return results in Json, for future Api stuff we'll eventually be using. Currently, the routes look like this:

/api/1/search/json?param1=blah&param2=blah&etc
/api/1/search/html?param1=blah&param2=blah&etc

For reference, the pattern here is /{area}/1/{controller}/{action}.

I like the look of some Api's I've seen that return results in different formats depending on the 'extension' they have in the url, a la:

/api/1/search.json?param1=blah&param2=blah&etc

However, I haven't figured out how to configure Asp.Net's Mvc routing to support this style. The general routing in ApiAreaRegistration.cs is:

context.MapRoute(
    "Api_default",
    "Api/1/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional });

I have tried the following, defined above the general one, which doesn't work:

//search api
context.MapRoute(
    "searchJson",
    "api/1/{controller}.{action}",
    new { controller = "SearchController" });

How would I configure routing to enable the .format-style urls?

context.MapRoute(
    "Api_default",
    "{area}/1/{controller}.{format}",
    new { action = "Index", id = UrlParameter.Optional });

is probably what you want. Then you could just return the different results based on the argument passed in.

Within the context of an Api Area, the SearchController would look like this:

public class SearchController : Controller
{
    public ActionResult Index(string format, SearchModel search)
    {
        var results = searchFacade.SearchStuff(search);

        if(format.Equals("xml"))
            return Xml(results); //using an XmlResult or whatever
        if(format.Equals("html"))
            return View(results);
        return Json(results, JsonRequestBehavior.AllowGet);
    }
}