新的ASP.net核心项目与脚手架编辑控制器只是返回404页未找到

本文关键字:返回 404页 控制器 编辑 net ASP 核心 项目 脚手架 新的 | 更新日期: 2023-09-27 18:14:14

只是尝试一个新的asp.net core项目,基于asp.net core web应用程序模板与个人用户帐户。下面的代码用于列表定义,并且查看和创建工作正常,但是—当我尝试保存编辑时,只有一个空白页面出现。在控制台中,我没有发现任何错误消息:只有404 Page Not Found。

模型
public class Listdefinition
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        [ScaffoldColumn(false)]
        public Guid Id { get; set; }
        public Guid UserGuid { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Listitem> ListItems { get; set; }
    }

视图
<form asp-action="Edit">
    <div class="form-horizontal">
        <h4>Listdefinition</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="Id" />
        <div class="form-group">
            <label asp-for="Name" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="UserGuid" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="UserGuid" class="form-control" />
                <span asp-validation-for="UserGuid" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>
控制器

namespace losol.ListR.Controllers
{
    public class ListdefinitionsController : Controller
    {
        private readonly ApplicationDbContext _context;
        public ListdefinitionsController(ApplicationDbContext context)
        {
            _context = context;    
        }
 // Some code emitted for brevity
 // GET: ListDefinitions/Edit/5
  public async Task<IActionResult> Edit(Guid? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var listDefinition = await _context.ListDefinition.SingleOrDefaultAsync(m => m.Id == id);
            if (listDefinition == null)
            {
                return NotFound();
            }
            return View(listDefinition);
        }
[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(Guid id, [Bind("Name,UserGuid")] Listdefinition listdefinition)
        {
            if (id != listdefinition.Id)
            {
                return NotFound();
            }
            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(listdefinition);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!ListdefinitionExists(listdefinition.Id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction("Index");
            }
            return View(listdefinition);
        }

和路线:

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

编辑:刚刚发现这个错误信息:

执行动作方法losol.ListR. controller . listdefinitionscontroller . edit (losol.ListR)参数为(f7ddb55a-398c-4212-b686-49c88550a26f,losol.ListR.Models.ListDefinition) - ModelState是有效的信息:Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory [1]已执行DbCommand (0ms) [Parameters=[@p2='?]",@p0 = ' ?' (Size = 4000), @p1='?'], CommandType='Text', CommandTimeout='30']设置nocount on;UPDATE [ListDefinition] SET [Name] = @p0, [UserGuid] = @p1WHERE [Id] = @p2;选择@@ROWCOUNT;失败:Microsoft.EntityFrameworkCore.DbContext [1]保存更改时,数据库中发生异常。Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预计影响1行,但实际影响0行行(s)。数据可能已经被修改或删除,因为实体加载。请参阅http://go.microsoft.com/fwlink/?LinkId=527962关于理解和处理乐观并发的信息例外。

新的ASP.net核心项目与脚手架编辑控制器只是返回404页未找到

答案是将Id添加到您想要绑定的属性列表中,以及工作控制器:

    // POST: ListDefinitions/Edit/d1f82c08-58c5-4247-b43c-0a4f99ce2311
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(Guid id, [Bind("Id, Name,UserGuid")] ListDefinition listDefinition)
    {
        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(listDefinition);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ListDefinitionExists(listDefinition.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(listDefinition);
    }

您发布的代码将在浏览器中404,因为它缺乏[HttpGet]方法。你说你省略了代码,但这是关于你的问题最重要的代码。

我认为问题是你在编辑操作中试图绑定的类型。根据示例// GET: ListDefinitions/Edit/5,应该是int?string?,但您指定的是Guid?。也许评论只是没有更新?我会尝试将该类型更改为string? idint? id并进行调试,以查看导航路由是否进入动作,以及是否存在id值,然后一旦您获得该工作,尝试将其切换为Guid。如果你真的想使用Guids,试着改成这样:

将控制器更改为具有路由前缀属性:

[RoutePrefix("listdefinitions")]
public class ListdefinitionsController : Controller

更改动作指定id的路由和类型:

[Route("edit/{id:guid}"]
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> Edit(Guid? id)

调试web API,在控制器中设置一个断点,并尝试在浏览器中点击http://localhost:/listdefinitions/edit/95dde7f309414b94bbc20b4d6b728d9f,看看guid是否正确地绑定到你的操作。对于web api,你必须小心不要有两个路由都匹配相同的传入请求,否则它会全部爆炸。

我不确定你的路由定义是否会以你所拥有的方式工作。Try use =>

routes.MapRoute(
    name: "default_route",
    template: "{controller}/{action}/{id?}",
    defaults: new { controller = "Home", action = "Index" });|

view change(实际上当你提交编辑表单时它会搜索Home controller)

<form asp-action="Edit">

:

<form asp-action="Edit" asp-controller="Listdefinitions" >