Я сталкиваюсь с ошибкой 405 при попытке загрузить сообщение в свой проект

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

#c# #asp.net-mvc #модель-вид-контроллер #asp.net-mvc-5 #asp.net-core-mvc

Вопрос:

У меня возникла проблема при попытке загрузить сообщение в мой блог разработки. Я пытаюсь загрузить сообщение с помощью MVC framework. Я пытаюсь следовать широкому кругу руководств о том, как создать блог.

Вот класс 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.

Спасибо.

Комментарии:

1. И URL, используемый для отправки запроса с ошибкой, является ..? 405 обычно указывает на неверно используемый URL-адрес или неправильно настроенный маршрут (например, пропущенный глагол). Обратите внимание, что ни один из материалов EF даже не имеет отношения к делу (равно как и другие значительные части). Работайте над созданием минимального примера / варианта воспроизведения .

2. Кроме того, убедитесь, что CORS включен , если это необходимо.

3. URL-адрес » localhost: 5001 / Create «. Я продолжаю получать ошибку 405 каждый раз, когда пытаюсь опубликовать. Я приступлю к работе над включением CORS.

Ответ №1:

Код состояния ответа по протоколу передачи гипертекста (HTTP) 405 «Метод не разрешен» указывает, что метод запроса известен серверу, но не поддерживается целевым ресурсом.

Генерируемый URL-адрес "localhost:5001/Create" , который соответствует только методу Create Get, в то время как форма отправляет запрос HttpPost, поэтому возникает ошибка 405.

1. Вы можете добавить asp-action="CreatePost" в свой тег формы,

2. Или просто добавьте тот же атрибут маршрута в свое действие CreatePost

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

Ответ №2:

Проверьте свой Create View (Create.cshtml), чтобы убедиться, что asp-action=»CreatePostAsync» в вашем теге формы.

Если проблема не в этом, пожалуйста, укажите также свой код просмотра.

Также установите точку останова в CreatePostAsync и следуйте дальше, чтобы увидеть, где возникает ошибка. Возможно, действие не запускается. Это означает, что ваша точка останова также не будет запущена.

Несколько других вещей, которые могут помочь либо с проблемой, либо с проектом:

  • BlogDbContext: OnModelCreating(), эти коды должны указывать на внешние ключи? Внешние ключи будут автоматически созданы / сопоставлены EF, если имя свойства равно {TableName}Id. Вы также можете быть явными, используя атрибут [ForeignKey] для ForeignKey
  • Контроллер: вы можете комбинировать метод и маршрут [HttpGet(«Создать»)]. Я уверен, что это не проблема, но просто хотел сообщить вам
  • Create(): не нужно передавать новую модель Post для view(), поскольку в вашем представлении уже будет «@model Post»
  • CreatePostAsync(): я бы предложил создать PostViewModel с необходимыми свойствами и проверками проверки. Используйте PostViewModel в качестве параметра. Это также означает, что вам нужно будет обновить свой Create view с @model Post на @model PostViewModel
  • CreatePostAsync(): всегда перенаправляйте метод post обратно, чтобы получить после завершения обработки. Единственный раз, когда вы должны вернуть View(), это если есть ошибки. В противном случае пользователь может спамить обновления и создавать несколько строк данных. Попробуйте сами, как только у вас заработает Create