【问题标题】:I'm encountering a 405 Error when I try to upload a post on my project当我尝试在我的项目上上传帖子时遇到 405 错误
【发布时间】:2020-12-16 19:05:58
【问题描述】:

我在尝试在我的开发博客上上传帖子时遇到问题。我正在尝试使用 MVC 框架上传帖子。我正在尝试遵循有关如何构建博客的大量指南。

这是 Post 类

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace ProjectWebApp.Models
{
    public class Post
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PostID { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public string Content { get; set; }
        public string Author { get; set; }
        public int Likes { get; set; }
        [Required]
        public DateTime DateCreated { get; set; }
        public DateTime? DateUpdated { get; set; }
        public ICollection<PostTag> PostTags { get; set; }
    }
}

这是 BlogDBContext:


using Project.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ProjectBlogWebApp.Data
{
    public class BlogDbContext : DbContext
    {
        public BlogDbContext(DbContextOptions<BlogDbContext> options) : base(options)
        {
            Database.EnsureDeleted();
            if (Database.EnsureCreated() == true)
            {
                Database.EnsureCreated();
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PostTag>().HasKey(p => new {p.PostID, p.TagID});
            modelBuilder.Entity<PostTag>().HasOne(pt => pt.Post).WithMany(p => p.PostTags)
                .HasForeignKey(pt => pt.PostID);
            modelBuilder.Entity<PostTag>().HasOne(pt => pt.Tag).WithMany(t => t.PostTags)
                .HasForeignKey(pt => pt.TagID);
        }



        public DbSet<Post> Posts { get; set; }

        public DbSet<Tag> Tags { get; set; }

        public DbSet<PostTag> PostTags { get; set; }
    }
}

这是 PostController 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ProjectWebApp.Data;
using ProjectWebApp.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.EntityFrameworkCore;

namespace ProjectWebApp.Controllers
{
    public class PostController : Controller
    {
        private BlogDbContext _dbBlogContext;

        public PostController(BlogDbContext dbContext)
        {
            _dbBlogContext = dbContext;
        }

        public IActionResult Index()
        {
            var postList = _dbBlogContext.Posts.ToList();

            return View(postList);
        }
        [HttpGet, Route("Create")]
        public IActionResult Create()
        {
            return View(new Post());
        }

        [HttpGet, Route("Edit")]
        public IActionResult Edit()
        {
            
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> CreatePostAsync([Bind("Title", "Content")] Post post)
        {
            try 
            {
                post.Likes = 0;
                post.DateCreated = DateTime.Now;
                post.Author = "Leonard Morrison";
                _dbBlogContext.Add(post);
                await _dbBlogContext.SaveChangesAsync();

                
            }

            catch (DbUpdateException)
            {
                ModelState.TryAddModelError( "Error: Post was not added properly!", "Sorry, the Post was not added properly. Please let me know if this problem persists");
            }

            return View(post);
        }

        [HttpGet]
        public IActionResult Show(int ID)
        {
            var post = getPost(ID);
            return View(post);
        }

        [HttpGet]
        public IActionResult Edit(int ID)
        {
            var post = getPost(ID);
            return View(post);
        }
        [HttpPatch]
        public IActionResult Update(int id)
        {
            var post = _dbBlogContext.Posts.Find(id);
            _dbBlogContext.Posts.Update(post);
            return RedirectToAction("Index");
            
        }

        [HttpDelete]
        public IActionResult RemovePost(int id)
        {
            Post deletedPost = getPost(id);

            _dbBlogContext.Posts.Remove(deletedPost);

            _dbBlogContext.SaveChanges();

            return RedirectToAction("Index");
        }


        public Post getPost(int ID)
        {
            var post = _dbBlogContext.Posts.First(p => p.PostID == ID);

            return post;
        }

    }
}


最后,这里是启动源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ProjectWebApp.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Http;


namespace ProjectBlogWebApp
{
    public class Startup
    {



        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();


            services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddScoped<BlogDbContext, BlogDbContext>();

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            //The Main EndPoint Routes
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id}");
            });
            
            //The Post Endpoints Routes
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(name: "post",
                    pattern: "{controller=Post}/{action=Index}/{title?}");

            });
        }
    }
}


因为我不知道错误到底出在哪里。但我需要知道这个 405 错误的来源。

谢谢。

【问题讨论】:

  • 而用于发出失败请求的 URL 是..? 405 通常表示使用的 URL 不正确或路由配置错误(例如,缺少动词)。请注意,EF 的 none 内容甚至是相关的(其他重要部分也不重要)。努力创建一个最小示例/复制案例
  • 另外,如果相关,确保 CORS 已启用
  • 网址是“localhost:5001/Create”。每次尝试发布时,我都会收到 405 错误。我将着手启用 CORS。

标签: c# asp.net-mvc model-view-controller asp.net-mvc-5 asp.net-core-mvc


【解决方案1】:

超文本传输​​协议 (HTTP) 405 Method Not Allowed 响应状态码表示服务器知道请求方法,但目标资源不支持。

生成的Url是"localhost:5001/Create",只匹配Create Get方法,而form发送HttpPost请求,所以出现405错误。

1.您可以在表单标签上添加asp-action="CreatePost"

2.或者只是在您的 CreatePost 操作中添加相同的路由属性

[HttpPost]
[Route("Create")]
public async Task<IActionResult> CreatePostAsync([Bind("Title", "Content")] Post post)

【讨论】:

    【解决方案2】:

    检查您的创建视图 (Create.cshtml) 以确保您的表单标签中有 asp-action="CreatePostAsync"。

    如果这不是问题,请同时包含您的查看代码。

    还在 CreatePostAsync 处放置一个断点,然后继续查看错误发生的位置。可能未触发该操作。这意味着,您的断点也不会被触发。

    其他一些可能有助于解决问题和/或项目的事情:

    • BlogDbContext: OnModelCreating(),那些代码是用来表示外键的吗?只要属性名称为 {TableName}Id,EF 就会自动创建/映射 ForeignKey。您也可以通过对 ForeignKey 使用 [ForeignKey] 属性来明确
    • 控制器:您可以结合方法和路由 [HttpGet("Create")]。我确定这不是问题,只是想让您知道
    • Create():不需要将新的 Post 模型传递给 view(),因为您的视图已经有“@model Post”
    • CreatePostAsync():我建议创建一个具有必要属性和验证检查的 PostViewModel。使用 PostViewModel 作为参数。这也意味着您需要将 Create 视图从 @model Post 更新为 @model PostViewModel
    • CreatePostAsync():始终将 post 方法重定向回来,以便在完成处理后获取。只有在出现错误时才应该返回 View()。否则,用户可能会垃圾邮件刷新并创建多行数据。让 Create 工作后,亲自尝试一下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多