通过AJAX请求DNN MVC执行操作

我的DNN MVC开发过程中出现了另一个问题。 我想知道这是否是一个错误/缺失的function我犯了一个错误。 我将尝试解释下面的问题。

我想要实现的目标

我想通过调用AJAXpost在我的控制器中执行一个动作。 到目前为止它的作用。 但是,当我尝试将一些变量返回到View时,它不仅返回变量。 它为响应添加了一个完整的HTML源代码。

JSON REPONSE

我的控制器

我的方法返回一个ActionResult(我尝试了JsonResult和其他不同的东西:HttpResponseMessage)。 程序本身正在工作,并返回JSON消息。

public ActionResult Mark(int itemId) { var item = _itemService.GetItem(itemId, ModuleContext.ModuleId); // Check if item exists if (item == null) return Json(new { success = false, Description = "the item you want to vote for does not exist (anymore)" }, JsonRequestBehavior.AllowGet); // Check if user is voting on his own item if (item.CreatedByUserId == User.UserID) return Json(new { success = false, Description = "it is not allowed to vote for your own item" }, JsonRequestBehavior.AllowGet); 

我的看法

下面的视图不是我的最终视图,但是要测试。

 $("#button").click(function () { $.ajax({ type: "POST", url: "@Url.Action("Mark", "Vote")", dataType: "json", data: { itemId: JSON.stringify(16) }, success: function (data) { console.log(data); }, error: function (errMsg) { responseText = jQuery.parseJSON(errMsg.responseText); console.log(responseText.Description); } }); }); 

这是一个错误,还是我能解决的问题? 非常感谢您的宝贵时间。 https://dnntracker.atlassian.net/browse/DNN-8522

根据DNN关于不支持的MVCfunction的文档,目前不支持除ActionResult之外的任何结果。

我能够在我的一个MVC控制器方法中返回一个JsonResult,它将返回JSON响应,但是,正如您所提到的,附加到它的是View HTML。 我的hacky解决方案是解析响应以获取我的json字符串。

 ... success: function (response) { var dnnViewResp = response.xhr.responseText; dnnViewResp = dnnViewResp.substring(0, dnnViewResp.indexOf("")); var data = JSON.parse(dnnViewResp); } 

但实际上,您需要为这些类型的服务创建WebAPI服务或处理程序,直到DNN添加对其他ActionResult类型的支持。

你需要传递url和标题如下:

 $.ajax({ type: 'post', url: "/DesktopModules/MVC/YourModuleName/controllerName/actionName", data: {itemId:JSON.stringify(16)}, headers: { "ModuleId": @Dnn.ModuleContext.ModuleId, "TabId":@Dnn.ModuleContext.TabId, "RequestVerificationToken": $("input[name='__RequestVerificationToken']").val() }, success: function (data) { ... }, error: function () { ... } }); 

================================================== =====

并且您必须在Module的根目录中具有RouteConfig.cs文件,并具有以下内容以注册路由:

 using DotNetNuke.Web.Mvc.Routing; namespace Dnn.Modules.YourModuleName { public class RouteConfig : IMvcRouteMapper { public void RegisterRoutes(IMapRoute mapRouteManager) { mapRouteManager.MapRoute("YourModuleName", "YourModuleName", "{controller}/{action}", new[] {"Dnn.Modules.YourModuleName.Controllers"}); } } } 

==========================================

但是!!!

在dnn mvc modoule中使用ajax的最佳方法是使用DnnMvcAjaxHandler库

那么你可以:

 @AjaxHandler.ActionLink(linkText: "delete", actionName: "delete", controllerName: "home", routeValues: new { id = item.Id }, ajaxOption: new AjaxHandlerOption { LoadingElementId = "#global-ajax-loading", OnConfirm = "are you sure ?", }, htmlAttributes: new { @class = "btn btn-danger btn-xs" }) 

我一直很难用这个,在尝试我在网上找到的所有内容后,最终解决了问题的方法是替换javascript中的url:

@ Url.Action(“ActionName”,“ControllerName”,new {SomeParameter =“SomeValue”))要:

dnn.getVar(“sf_siteRoot”,“/”)+“DesktopModules / MVC / ModuleName / Controller / Action”