ASP.NET MVC Core通过Ajax Post向控制器发布了一个字符串

时间:2017-01-18 06:35:23

标签: ajax visual-studio-2015 asp.net-core asp.net-core-mvc

尝试使用Ajax将字符串值发送到Home控制器。在Ajax调用之后会出现错误(在Google Chrome开发人员工具中):Failed to load resource: the server responded with a status of 404 (Not Found)

$.ajax({
    url: 'Home/TestAction',
    data: "Test data",
    type: 'POST',
    success: function (obj) {
        alert('Suceeded');
    }
});

更新

之后我已经尝试了所有回复(截至目前)的网址部分到这篇文章,网址结果是正确的,但我还是得到了{ {1}}和warning,如下图所示。 注意:图像中控制器和操作的名称不同,但它们位于VS2015中名为Controllers的默认文件夹中。我没有创建任何子文件夹等。此外,这是在开发机器error上。请点击图片以便能够清楚地看到该消息。

更新2

为了使我的问题更容易理解,我已经在official ASP.NET MVC Core tutorial之后创建了一个测试ASP.NET核心应用程序。请参阅下面的错误图片。

控制器

Win10 with VS2015 ASP.NET Core 1.1, IIS EXPRESS

查看 [.. \ views \ movies \ Index.cshtml]。注意:我最后只添加了一个额外的按钮[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("ID,Genre,Price,ReleaseDate,Title")] Movie movie) { if (id != movie.ID) { return NotFound(); } if (ModelState.IsValid) { try { _context.Update(movie); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!MovieExists(movie.ID)) { return NotFound(); } else { throw; } } return RedirectToAction("Index"); } return View(movie); } <button type="button" id="testid" class="Savebtn">Test</button> 来电。

Ajax

错误[在Google Chrome开发者工具中]

enter image description here

3 个答案:

答案 0 :(得分:2)

应该是(如果你在js文件中):

$.ajax({
    url: '/Home/TestAction', //note this line (You get your url from root this way, not relative like you do)
    data: "Test data",
    type: 'POST',
    success: function (obj) {
        alert('Suceeded');
    }
});

或者像Stephen Muecke说的那样(如果您的脚本在View上):

$.ajax({
    url: '@Url.Action("TestAction", "Home")', //note this line
    data: "Test data",
    type: 'POST',
    success: function (obj) {
        alert('Suceeded');
    }
});

答案 1 :(得分:2)

将您的网址更改为

   url: '@Url.Action("TestAction", "Home")'

始终使用Url.Action帮助程序方法生成操作方法的完全限定URL。您可以查看更多详细信息并重载here

答案 2 :(得分:2)

之前发布的所有答案似乎都非常不灵活且无法正常工作,因为在剃刀模板引擎中未定义JavaScript代码,这在捆绑/缩小cs / js文件时会产生效果。

尝试将其添加到标题部分

中的_Layout.cshtml文件中
<head>
    ...
    <base href="~/"/>
</head>

这会将基本网址设置为您的应用程序主页。所有相对网址都将附加到此基本网址。这也适用于jQuery请求,因为较新的版本确实尊重base-Tag,因此当你的JavaScript代码没有在razor(* .cshtml)模板中呈现时应该可以正常工作。

更新

嗯......

  1. 问题是您的控制器操作需要Movie模型。你不能发一个简单的字符串。
  2. 你发布的是一个MVC动作,它返回一个视图,没有数据。您不能将此用于ajax,因为它将返回HTML代码。对于Ajax,您需要Json对象。
  3. 您的操作应该类似于

    [Route("api/[controller")]
    public class MovieController {
        [HttpPost("{id}")]
        public async Task<IActionResult> Edit(int id, [FromBody] Movie movie)
        {
    
        }
    }
    

    注意:通常,对于RESTful服务,您使用PUT更新/替换资源,使用POST来创建它。见Relationships between URL and HTTP Methods

    和你的jQuery / Ajax请求一样

    // example movie object, this depends on the definition of your model class on the server
    var movie = {
        id: 1,
        name: "Back to the Future", 
        genre: "Sci-Fi"
    };
    $.ajax({
        url: 'api/movies/'+movie.id,
        data: movie,
        type: 'POST',
        success: function (obj) {
            alert('Suceeded');
        }
    });