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

时间:2018-11-28 18:10:16

标签: javascript c# ajax

我一直在努力获取此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);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

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

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

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

$.ajax({
    url: 'GetMarketingMaterial'

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

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

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

答案 1 :(得分:0)

请在控制台中检查网址。网址可能有问题 使用

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

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

答案 2 :(得分:0)

我昨晚发现了这个。遗憾的是,为了将来参考,我不是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控制器中对我不起作用,如果有人想补充为什么会这样,我很想听听您的反馈,但我也会自己做一些研究。