繁体   English   中英

获取Ajax调用未达到控制器操作

[英]Get Ajax call not hitting controller action

我一直在努力获取此Get请求以击中URL。 我试着在一个单独的js文件中手动输入url参数,然后再将所有js移至cshtml以方便剃刀。 在请求上仍然出现404错误。 非常感谢您的帮助,因为我是新手。

function ShowMarketingMaterial() {

$.ajax({
    url: "@Url.Action("GetMarketingMaterial", "MarketingMaterialController")",
    type: "GET",
    data: option,
    dataType: 'json',
    success: OnSuccess,
    failure: function (response) {
        alert(response.d);
    }
});

这是我的控制器:

using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Mvc;
using WebApplication2.Data;
using WebApplication2.Models;

namespace WebApplication2.Controllers
{
    public class MarketingMaterialController : ApiController
    {
        private ImprevDBEntities db = new ImprevDBEntities();
        //[System.Web.Services.WebMethod]

        [System.Web.Http.HttpGet]
        //[System.Web.Http.Route("{GetMarketingMaterial}")]

        public IHttpActionResult GetMarketingMaterial(string test)
        {
            var test1 = from M in db.DimMarketingMaterials
                        join I in db.DimListingIdentifiers on M.ListingId equals I.ListingId
                        where M.Url.StartsWith("https://client.marketing.imprev.net/")
                        && I.ListingNumber == test
                        select new MarketingMaterial
                        {
                            UrlMaterial = M.Url,
                            Description = M.Description
                        };


            var response = new MarketingMaterialsViewModel();
            response.MarketingMaterials = new List<MarketingMaterial>();
            response.MarketingMaterials = test1.ToList();

            return Ok(response);
        }
    }
}

您不能在.js文件中使用@Url.Action() 您可以手动设置URL,例如:

$.ajax({
    url: '../MarketingMaterial/GetMarketingMaterial'

用于当前控制器请求之外的内容(请注意, ../是使URL与当前MVC视图相对)或仅

$.ajax({
    url: 'GetMarketingMaterial'

请求提供当前视图的同一控制器内部的操作方法。

同样要注意的是,如果Url.Action用于视图中而不是JS文件中,则无需指定单词“ controller”。

url: '@Url.Action("GetMarketingMaterial", "MarketingMaterial")',

请检查控制台中的网址。 您可能对网址使用有疑问

'@Url.Action("GetMarketingMaterial", "MarketingMaterialController")'

我认为您的“”创建问题。 希望这会有所帮助

我昨晚想通了。 遗憾的是,为了将来参考,我不是100%的原因,也许有人可以添加这个答案。 但是我最初将其设置为Web API控制器,但经过反复试验,最终导致重新创建控制器,而创建了常规MVC控制器。 我将代码复制并粘贴到控制器中,并能够访问URL。 我对代码和名称空间进行了一些小的更改。

这是新的工作控制器:

namespace WebApplication2.Controllers
{
    [RoutePrefix("api/MarketingMaterial")]
    public class TestController : Controller
    {
        private ImprevDBEntities db = new ImprevDBEntities();

        // GET: Test
        [HttpGet]
        [Route("GetMarketingMaterials/{option}")]
        public ActionResult Index(string option)
        {
            var test1 = from M in db.DimMarketingMaterials
                        join I in db.DimListingIdentifiers on M.ListingId equals 
                        I.ListingId
                        where 
                        M.Url.StartsWith("https://client.marketing.imprev.net/")
                        && I.ListingNumber == option
                        select new MarketingMaterial
                        {
                            UrlMaterial = M.Url,
                            Description = M.Description
                        };


            var response = new MarketingMaterialsViewModel();
            response.MarketingMaterials = new List<MarketingMaterial>();
            response.MarketingMaterials = test1.ToList();

            return Json(response, JsonRequestBehavior.AllowGet);
        }
    }
}

和Ajax调用:

    function ShowMarketingMaterial() {

    $.ajax({
        url: '/api/MarketingMaterial/GetMarketingMaterials/' + option,
        type: 'GET',
        dataType: 'json',
        success: OnSuccess,
        failure: function (response) {
            alert(response.d);
        }
    });

}

请注意,此代码与原始文章并不完全相同,因为为了使其正常工作而进行了许多更改。 但是,此代码在Web Api控制器中对我不起作用,如果有人想补充为什么会这样,我很想听听您的反馈,但我也会自己做一些研究。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM