带有脚手架编辑控制器的新ASP.net核心项目只返回404找不到的页面

时间:2016-10-22 11:01:16

标签: c# asp.net asp.net-mvc asp.net-core

尝试新的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   有关理解和处理乐观并发的信息   异常。

3 个答案:

答案 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? 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,你必须要小心,永远不要有两个匹配相同传入请求的路由,否则它们都会爆炸。