Во-первых, я думаю, у вас может быть неправильное понимание маршрутизации. Похоже, вы используете имя пространства имен в своем URL-адресе. Если ваш модуль не называется «NewController», ваш URL-адрес не будет работать. Маршрутизация DNN очень похожа на маршрутизацию веб-API, за исключением того, что вы должны указать имя папки модуля как таковое /DesktopModules/<moduleFolderName>/API/
. Итак, если у вас есть модуль с именем 'MyModule'
, а ваш контроллер находится в пространстве имен с именем 'NewController'
, адрес будет
'http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/HelloWorld а>'
Тогда маршрут по умолчанию будет выглядеть следующим образом;
mapRouteManager.MapHttpRoute(
"MyModule",
"default",
"{controller}/{action}",
new[] { "NewController" });
который также можно переписать с именованными параметрами как таковыми
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "default",
url: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
namespaces: new[] { "NewController" }
);
См. эту ссылку для получения дополнительной информации.
Что касается вашей второй части, у вас может быть несколько маршрутов? Конечно;
Скажем, ваш контроллер имеет следующие действия
namespace NewController
{
public class NewInfoController : DnnApiController
{
[AllowAnonymous]
[HttpGet]
public HttpResponseMessage HelloWorld()
{
return Request.CreateResponse(HttpStatusCode.OK, "Hello World!");
}
[HttpGet]
public HttpResponseMessage GetItemByName(string name)
{
//your logic here
}
[HttpGet]
public HttpResponseMessage GetItemByNameAndLocation(string name, string location)
{
//your logic here
}
}
}
тогда ваш класс маршрутизации будет выглядеть так
namespace NewController
{
public class RouteMapper : IServiceRouteMapper
{
public void RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByName",
url: "{controller}/{action}/{name}",
defaults: new { name = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByNameAndLocation",
url: "{controller}/{action}/{name}/{location}",
defaults: new { name = "", location = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "default",
url: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
namespaces: new[] { "NewController" }
);
}
}
}
Теперь http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByName/someName
будет обрабатываться первым маршрутом, http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByNameAndLocation/someName/someLocation
будет обрабатываться вторым маршрутом. Все, что не соответствует этим двум, будет обрабатываться последним маршрутом default
. Помните, что иерархия в маршрутизации важна!
Что делать, если вы хотите сократить URL-адреса, чтобы сказать
http://localhost/dnn7/DesktopModules/MyModule/API/fetch/someName
и
http://localhost/dnn7/DesktopModules/MyModule/API/fetchByNameAndLocation/someName/someLocation
Обратите внимание, что мы не указали Controller
и Action
. Все, что нам нужно сделать, это изменить первые два маршрута на
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByName",
url: "fetch/{name}",
defaults: new { controller = "NewInfo", action = "GetItemByName", name = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByNameAndLocation",
url: "fetchByNameAndLocation/{name}/{location}",
defaults: new { controller = "NewInfo", action = "GetItemByNameAndLocation", name = "", location = "" },
namespaces: new[] { "NewController" }
);
Если вы знакомы с Web Api, вы заметите, что маршрутизация сервисов DNN очень похожа, поскольку это просто оболочка вокруг маршрутизации базового Web Api. Удачи!
person
Moses Machua
schedule
02.08.2015