新的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关于理解和处理乐观并发的信息例外。
答案是将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? id
或int? 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" >