你如何从ajax调用一个通用的控制器方法?

时间:2017-01-13 00:19:15

标签: ajax asp.net-mvc getjson nancy

我在asp.net-mvc中使用Nancy框架。在各种视图中,我希望能够通过ajax / getJSON从公共模块调用方法,而不是必须在每个控制器模块中复制端点,但到目前为止还没有成功。

假设我的控制器模块如下所示:

namespace SomeNamespace
{
    using Microsoft.EntityFrameworkCore;
    using Models;
    using Nancy;

    public class CommonModule : NancyModule
    {
        public CommonModule(IAppRepository repo)
        {
            Get("/EndpointName/{someargument}", async (x, ct) =>
            {
                string result = string.Empty;
                int someargument;
                if(int.TryParse(x.apptype, out someargument))
                {
                    var data = await repo.SomeModel.AsNoTracking().ToListAsync().ConfigureAwait(false);
                    result = Response.AsJson(data);
                }

                return result;

            });

        }
    }
}

在我的js文件中,我有类似的内容:

function callMethod()
{
    var someargument = $('#SomeControl').data('somedata');
    var url = window.location.protocol + '/' + window.location.host + '/CommonModule/EndpointName/' + someargument;
    $.getJSON(url, function (json) {
        //process if/as required;
    })
    .done(function (info) {
        //process if/as required;
    })
    .fail(function (jqxhr, textStatus, error) {
        //process if/as required;
    });

}

这可能吗?如果是这样,这是怎么做到的?我只是错误地构建了网址,还是确保.cshtml文件中存在正确的引用?

3 个答案:

答案 0 :(得分:1)

尝试类似:

$('#CommonModulebtn').click(function () {

$.ajax({
    url: '/CommonModule/CommonModule',
    type: "GET",
    dataType: "JSON",
    data: { IAppRepository : $('#SomeControl').data('somedata').val() },
    success: function (info) {}

答案 1 :(得分:1)

  function callMethod() {
    $.ajax({
        url: "/CommonModule/CommonModule",
        type: "GET",
        data: $("#IDFORM").serialize(),
        dataType: "json",
        success: function (data, textStatus, jqXHR) {
           alert("ok");
        },
        error: function (data) {
            alert("error");
        }
    })
}

答案 2 :(得分:1)

您可以从应用程序中的任何控制器视图调用任何控制器操作。你的代码很好。您需要确保构建正确的URL。

我不熟悉NancyFx路由,但我认为你需要从URL中删除'CommonModule',它看起来像:

var url = window.location.protocol + '/' + window.location.host + '/EndpointName/' + someargument;

如果是常用模块,您可能需要更改服务器上的路由:

public CommonModule(IAppRepository repo)
{
     Get("/common/EndpointName/{someargument}", async (x, ct) => ...

,JavaScript中的网址为

var url = window.location.protocol + '/' + window.location.host + '/common/EndpointName/' + someargument;