尝试新的asp.net核心项目,基于具有单独用户帐户的asp.net核心Web应用程序模板。 下面的代码用于列表定义,查看和创建工作正常,但是当我尝试保存编辑时,只会出现一个空白页面。在控制台中,我找不到任何错误消息:仅找不到404页面。
模型
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.Controllers.ListDefinitionsController.Edit(losol.ListR) 带参数(f7ddb55a-398c-4212-b686-49c88550a26f, losol.ListR.Models.ListDefinition) - ModelState是有效信息: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory [1] 执行DbCommand(0ms)[参数= [@ p2 =&#39;?&#39;,@ p0 =&#39;?&#39; (大小= 4000),@ p1 =&#39;?&#39;],CommandType =&#39;文字&#39;,CommandTimeout =&#39; 30&#39;] 设置NOCOUNT ON; UPDATE [ListDefinition] SET [Name] = @ p0,[UserGuid] = @ p1 WHERE [Id] = @ p2; SELECT @@ ROWCOUNT;失败:Microsoft.EntityFrameworkCore.DbContext [1] 保存更改时数据库中发生异常。 Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预计会影响1行但实际影响0 行(S)。自实体以来,数据可能已被修改或删除 加载。请参阅http://go.microsoft.com/fwlink/?LinkId=527962 有关理解和处理乐观并发的信息 异常。
答案 0 :(得分:2)
答案是将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);
}
答案 1 :(得分:1)
我不确定您的路线定义是否会以您拥有的方式运作良好。尝试使用=&gt;
routes.MapRoute(
name: "default_route",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });|
并且在视图中更改(当您提交编辑表单时,它会搜索Home控制器)
<form asp-action="Edit">
为:
<form asp-action="Edit" asp-controller="Listdefinitions" >
答案 2 :(得分:1)
您在浏览器中发布的代码404
因为它缺少[HttpGet]
方法。你说你省略了代码,但这是最重要的代码,不能省略你的问题。
<强>更新强>
我认为问题是您在编辑操作中尝试绑定的类型。您根据示例Guid?
指定int?
时应该string?
或// GET: ListDefinitions/Edit/5
。也许评论还没有更新?我尝试将该类型更改为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,你必须要小心,永远不要有两个匹配相同传入请求的路由,否则它们都会爆炸。