从 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 调用
希望这对您有用。
重新毕业
我正在尝试从 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 调用
希望这对您有用。 重新毕业