【问题标题】:Multiple actions matched多个动作匹配
【发布时间】:2019-11-13 06:01:27
【问题描述】:

我已迁移到ASP.NET Core 2.1。我想提交一个表单(来自 ArticleController 的插入方法:url:http://localhost:52125/article/insert)但我收到此错误:

处理请求时发生未处理的异常。 AmbiguousActionException:匹配多个操作。下列 动作匹配路由数据并满足所有约束:

Jahan.Beta.Web.App.Controllers.ArticleController.Insert (Jahan.Beta.Web.App) Jahan.Beta.Web.App.Controllers.ArticleController.Edit (Jahan.Beta.Web.App) Jahan.Beta.Web.App.Controllers.ArticleController.DeleteConfirmed (Jahan.Beta.Web.App) Microsoft.AspNetCore.Mvc.Internal.ActionSelector.SelectBestCandidate(RouteContext 上下文,IReadOnlyList 候选人)

我该如何解决?有没有办法改进/优化 routes.MapRoute?

文章管理员:

[Route("[controller]")]
public class ArticleController : Controller
{
   [HttpPost]
   public async Task<IActionResult> Insert([FromBody]Article article)
   {
      // I want to run this method!
   }

   [HttpGet("Edit/{id}")]
   public async Task<IActionResult> Edit(int? id)
   {
   }
   [HttpPost]
   [ValidateAntiForgeryToken]
   public async Task<IActionResult> Edit(int id, [FromBody] Article article)
   {
   }

   [HttpPost, ActionName("DeleteConfirmed/{id}")]
   public async Task<IActionResult> DeleteConfirmed(int id)
   {
   }
}

startup.cs 文件的一部分:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseAuthentication();

        var provider = new FileExtensionContentTypeProvider();
        provider.Mappings[".less"] = "plain/text";

        app.UseStaticFiles(new StaticFileOptions
        {
            ContentTypeProvider = provider
        });

        ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration).Wait();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "areas",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
            );

            routes.MapRoute(
                name: "AdminAreasUsers",
                template: "{area:exists}/{controller=Users}/{action=Index}/{id?}"
            );
            routes.MapRoute(
                name: "AdminAreasDeleteUser",
                template: "{area:exists}/{controller=Users}/{action=Delete}/{id}"
            );
            routes.MapRoute(
               name: "FilterByTagAsync",
               template: "{controller}/{action}/{tagId}/{articlePage}",
               defaults: new { controller = "Article", action = "FilterByTagAsync", tagId = "", articlePage = "" }
           );
            routes.MapRoute(
               name: "ShowArticle",
               template: "{controller}/{action}/{Id}",
               defaults: new { controller = "Article", action = "Show", Id = "" }
           );

            routes.MapRoute(
               name: "default",
               template: "{controller}/{action}",
               defaults: new { controller = "Home", action = "Index" }
           );
            routes.MapRoute(
                name: "About",
                template: "{Controller=AboutUs}/{action=AboutUs}/{id?}");

        });

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
    }

【问题讨论】:

  • 您发帖的路线是什么?
  • 来自 /Article/Create url 我想提交一个方法在 /Article/Insert 上的表单

标签: asp.net asp.net-core routes asp.net-core-2.1


【解决方案1】:

您正在使用基于属性的路由,但尚未将任何路由应用于任何这些操作。因此,他们都使用默认的"",或者一个空路由。您需要执行以下操作:

[HttpPost("insert")]
public async Task<IActionResult> Insert([FromBody]Article article)

[HttpGet("Edit/{id}")]
public async Task<IActionResult> Edit(int? id)

[HttpPost("edit/{id}")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [FromBody] Article article)

[HttpPost("delete"), ActionName("DeleteConfirmed/{id}")]
public async Task<IActionResult> DeleteConfirmed(int id)

【讨论】:

  • 我应用了它们,但我收到此错误“状态代码:415;不支持的媒体类型”
  • 这是一个完全不同的问题。您现在已经解决了问题中的问题,但您现在还需要解决另一个问题。你真的应该为此提出一个新问题。但是,我会说这是请求正文编码的结果。例如,如果您在未启用 XML 序列化程序的情况下发布 XML,那就是您的问题。
  • 我从 Insert 方法中删除了 [FromBody],现在可以了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多