2015-07-29 4 views
2

я реализовал модуль, в котором я разделил, что на две части:Есть ли возможность добавить несколько маршрутов в маршрутном картографе Dnn в

  1. Веб-проект:
    Который с моим UI страницы как ASCX и ajax-вызов для запуска моего веб-API и получения данных.
  2. Библиотека классов:
    У меня есть контроллеры API и класс mapper. ALl работает нормально, но браузер обрабатывает ошибку как «404». Это означает, что URL-адрес не найден. Я путаю то, где я ошибся.

Вот мой маршрутизатор Mapper Класс: -

using DotNetNuke.Web.Api; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI.WebControls; 

namespace NewController 
{ 
    public class RouteMapper : IServiceRouteMapper 
    { 
     public void RegisterRoutes(IMapRoute mapRouteManager) 
     { 
      mapRouteManager.MapHttpRoute("NewController", "default", "{controller}/{action}", 
       new[] { "NewController" }); 
     } 
    } 
} 

Я проверил свои пространства имен и имя папки много раз, но не нашел никакой вины там.

My Controller namespace is like below:- 
using DotNetNuke.Common.Utilities; 
using DotNetNuke.Web.Api; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

namespace NewController 
{ 
    public class NewInfoController : DnnApiController 
    { 
     [AllowAnonymous] 
     [HttpGet] 
     public HttpResponseMessage HelloWorld() 
     { 
      return Request.CreateResponse(HttpStatusCode.OK, "Hello World!"); 
     } 
    } 
} 

Получение URL надлежащим образом, а также: - локон 'http://localhost/dnn7/DesktopModules/NewController/API/NewInfo/HelloWorld'

Или

Проблема в том, что я имею несколько контроллеров API? Нужно ли настраивать несколько маршрутов? Если да, то как?

+0

Я пытаюсь понять вашу проблему. Получаете ли вы ошибку 404 при попытке проверить свою службу с помощью браузера с помощью http: // localhost/dnn7/DesktopModules/NewController/API/NewInfo/HelloWorld? Если да, то DLL библиотеки классов библиотеки встроена в папку DNN/bin? – DotNetNuclear

ответ

4

Во-первых, я думаю, что у вас может быть непонимание маршрутизации. Похоже, вы используете имя пространства имен в своем URL-адресе. Если ваш модуль не называется «NewController», ваш URL-адрес не будет работать. Маршрутизация DNN очень похожа на маршрутизацию Web 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" } 
    ); 

См this link for more info

Что касается вашей второй части, вы можете иметь несколько маршрутов? Конечно;

Скажите ваш контроллер имеет следующие действия

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 nd 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" } 
); 

Если вы знакомы с веб-Апи, вы заметите маршрутизации услуги Dnn очень похожа, так как это всего лишь обертка вокруг основного веб-маршрутизации API. Удачи!