【问题标题】:calling an mvc controller from a javascript file within a webforms project从 webforms 项目中的 javascript 文件调用 mvc 控制器
【发布时间】:2015-01-20 17:25:07
【问题描述】:

我正在尝试从 webforms 项目中的 Javascript 文件调用 MVC 控制器,但无论我提供什么 url,都找不到 Controller 方法。

如果有人能帮我正确设置网址,将不胜感激。

代码如下: 我修改了 RouteConfig 文件以包含控制器所在的命名空间:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "WarrantyUI.Controllers" }
            );
        } 

这是我尝试调用控制器的 JS 文件,其中包含所有变体(请参阅“url”属性)——它们都不起作用。

function getJournalVoucherData(parms)
{
    //var url = '<%= Url.Action("GetJournalVoucherDataAsync","JournalVoucher") %>';
    //var url = '<%=Page.ResolveUrl("/WarrantyUI/Controllers/JournalVoucher/GetJournalVoucherDataAsync)%>';
    //var serviceBase = '/JournalVoucher/'
  //  url: serviceBase + 'GetJournalVoucherDataAsync',
    $.ajax({
        //url: url,
        //url: '@Url.Action("GetJournalVoucherDataAsync", "JournalVoucher")',
        url: "/WarrantyUI/Controllers/JournalVoucher/GetJournalVoucherDataAsync",
        //url: Url.Content("GetJournalVoucherDataAsync", "JournalVoucher"),
        //url: Url.Content("/WarrantyUI/Controllers/JournalVoucher/GetJournalVoucherDataAsync"),
        //url: "/Controllers/JournalVoucher/GetJournalVoucherDataAsync",
        //url: "/JournalVoucher",
        //url: "/WarrantyUI/Controllers/JournalVoucherController/GetJournalVoucherDataAsync",
        //url: "/WarrantyUI/Controllers/JournalVoucher/GetJournalVoucherDataAsync",
        data: JSON.stringify(parms),
        dataType: "json",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        async: true,
        success: function (data, textStatus)
        {
            if (textStatus == "success" && data && data.kvs && data.kvs.length > 0)
            {
                $("#JournalVoucherGrid-table").children().show();
                $("#JournalVoucherGrid-table")[0].addJSONData(data);
                $("#JournalVoucherGrid-table > span.grdMsg").hide(); $(".divLoadMsg").hide();
            }
            else
            {
                $("#JournalVoucherGrid-table > :not(.grdMsg)").hide(); $("span.grdMsg", $("#JournalVoucherGrid-table")).html('...').show(); $(".divLoadMsg").hide();
            }
        },
        error: function (data, textStatus, sss)
        {
            alert(cnxError + '\n' + sss); $(".divLoadMsg").hide();
        }
    });
};

这是控制器文件:

namespace WarrantyUI.Controllers
{
    public class JournalVoucherController : Controller
    {
        //TODO: Add await keyword when making DB call to retrieve actual data from GetJournalVoucherDataAsync method

        /// <summary>
        /// 
        /// </summary>
        /// <returns>JsonResult - Grid data</returns>
        [HttpPost]
        public JsonResult GetJournalVoucherDataAsync()
        {

最后,附图显示了此 Contoller 方法所在的确切路径,但未找到:

编辑

请注意,这在本地可以正常工作,但是一旦部署到 Web 服务器,即使您查看图像,也无法解析控制器路径,路径正是它应该在的位置并且文件物理存在。

我是否需要在 Web 服务器上对 IIS 执行任何操作来解析路径。

任何其他有关如何解决此问题的信息将不胜感激......

【问题讨论】:

  • 试试/JournalVoucher/GetJournalVoucherDataAsync
  • 附带说明,最好不要以 Get 开头的 [POST] 方法。这非常具有误导性

标签: javascript c# asp.net asp.net-mvc


【解决方案1】:

默认情况下,ASP.NET MVC 将在 Controllers 文件夹中查找控制器。它将尝试查找名称为XController 的控制器,其中X 是与您的路由匹配的URL 的{controller} 部分。然后,在该控制器中,它将尝试查找与路由的 {action} 部分中的名称匹配的方法。

你想要匹配的控制器是JournalVoucher,你想要的动作是GetJournalVoucherDataAsync,所以你实际需要的URL是:

/JournalVoucher/GetJournalVoucherDataAsync

旁白:正如@Jonesy 在 cmets 中指出的那样,使用 Get 前缀命名 [POST] 方法可能不是一个好主意。它会起作用,但会令人困惑。

【讨论】:

  • 哇...我觉得自己像个白痴...我不敢相信我没有尝试过那种特定的语法(我一直都知道这是正确的方法)。它完全让我忘记了.....
  • 我知道我遗漏了一些东西......这就是我拥有它的方式,并且在本地工作得很好。但是,当我部署到网络服务器时,它无法解析 URL(参见 EDIT 中的第二张图片)。
  • any MVC 路由是否在您的网络服务器上工作?这听起来与上面的问题完全不同——你的 web.config 中有 &lt;modules runAllManagedModulesForAllRequests="true"/&gt; 吗?
【解决方案2】:

你可以在 javascript 中做这样的事情来获取你的 web 应用程序的基本 url var baseWebURL = '';

然后您可以将控制器和操作方法名称添加到其中并将其传递给 ajax 调用

希望这对你有用。 毕业生

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多