【问题标题】:Routing in DNN SPA Module is not working as expectedDNN SPA 模块中的路由未按预期工作
【发布时间】:2018-08-17 13:19:20
【问题描述】:

我似乎无法弄清楚如何访问我的一个控制器上的方法,设置控制器可以正常工作...

ServiceRouteMapper:

public void RegisterRoutes(IMapRoute mapRouteManager)
{
       mapRouteManager.MapHttpRoute(
           moduleFolderName: "ImportantDatesModule",
           routeName: "default",
           url: "{controller}/{action}/{id}",
           defaults: new { id = RouteParameter.Optional },
           namespaces: new[] { "company.ImportantDatesModule.Services" });
}

控制器:

[SupportedModules("ImportantDatesModule")]
[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)]
public class ItemController : DnnApiController
...

[HttpGet]
[ActionName("getItems")]
public HttpResponseMessage GetItems() 
{
    return Request.CreateResponse(HttpStatusCode.OK, "success");
}

正在调用的JS文件:

dnnspamodule.itemsViewModel = function (moduleId, resx) {
var service = {
    path: "ImportantDatesModule",
    framework: $.ServicesFramework(moduleId),
    controller: "Item"
}
service.baseUrl = service.framework.getServiceRoot(service.path);
...

var getItems = function () {
    var restUrl = service.baseUrl + service.controller + "/getItems";
    console.log(restUrl);

    isLoading(true);
    var jqXHR = $.ajax({
        url: restUrl,
        beforeSend: service.framework.setModuleHeaders,
        dataType: "json"
    }).done(function (data) {
        if (data) {
            load(data);
            isLoading(false);
        }
        else {
            // No data to load 
            itemList.removeAll();
        }
    }).always(function (data) {

    });
};

【问题讨论】:

  • 能否添加一个ajax .fail() 方法来获取http 错误码。是 401、404 吗?
  • 是500错误,但是查看响应是404。(响应状态码不表示成功:404(未找到))

标签: dotnetnuke dotnetnuke-9


【解决方案1】:

我不知道您的设置控制器是什么样的,但也许可以尝试将您的路由分为动作样式({controller}/{action})与休息样式路由({controller}/{id} + 派生动词 in方法名称)。在你的服务路由映射器中试试这个:

mapRouteManager.MapHttpRoute(
    moduleFolderName: "ImportantDatesModule",
    routeName: "default", 
    url: "{controller}/{action}",
    namespaces: new[] {"company.ImportantDatesModule.Services"});

mapRouteManager.MapHttpRoute(
    moduleFolderName: "ImportantDatesModule",
    routeName: "rest",
    url: "{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    namespaces: new[] { "company.ImportantDatesModule.Services" });

【讨论】:

  • 抱歉,我花了这么长时间才回复,我还有其他几项任务必须完成,然后才能回到这里。事实证明,我的问题是由我认为通过还原数据库删除的残留模块引起的。哪个没有删除/更改模块修改的文件。我解决了这个问题,现在我得到了 401(未经授权)任何想法,根据我在问题中显示的配置可能会发生什么情况?
  • @JohnKane - 注释掉 ItemController 类上的 SupportedModules 和 DnnModuleAuthorize 属性并添加 [AllowAnonymous]。然后检查您是否得到正确的响应。如果是这样,请注释掉 allowanonymous 并一次取消注释其他属性。如果问题是 SupportedModules 属性,请尝试将清单文件中 的值也更改为“ImportantDatesModule”。我想确保清单中的模块名称(在组件类型=模块下)与路由中的“moduleFolderName”相同。
  • 我注释掉了支持的模块和 dnn 模块授权并添加到 AllowAnonymous 中,但我仍然看到 401 错误......看起来真的很奇怪。如果您将允许匿名放在类或方法级别,会有所不同吗?
  • 类级别的 AllowAnonymous 应该适用于该类的所有方法,除非在方法中添加了另一个更具限制性的属性。我不确定你为什么仍然得到 401。也许尝试在另一个环境中安装模块。
  • 抱歉,我急于让这个工作,我把 AllowAnonymous 放在了错误的控制器上......现在我得到了 200,因为我将它添加到了正确的控制器中。我尝试取消注释支持的模块和 dnn 模块一次授权一个,无论哪个未注释它都会再次给出 404(这是一次取消注释它们)
猜你喜欢
  • 2014-05-02
  • 2016-08-19
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多