从 webforms 项目中的 javascript 文件调用 mvc 控制器

calling an mvc controller from a javascript file within a webforms project

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

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

代码如下: 我修改了 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" 属性)- none 它们有效。

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 执行任何操作才能解析路径。

如果能提供有关如何解决此问题的任何其他信息,我们将不胜感激....

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

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

/JournalVoucher/GetJournalVoucherDataAsync

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

您可以在 javascript 中执行类似的操作来获取 Web 应用程序的基础 url var baseWebURL = '<%=HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)+HttpContext.Current.Request.ApplicationPath%>';

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

希望这对您有用。 重新毕业