ASP MVC 6 RC1 Edit 表单创建

本文关键字:表单 创建 Edit RC1 MVC ASP | 更新日期: 2023-09-27 18:32:50

我在MVC 6 RC1 ASP.NET 有一个简单的Web应用程序。

问题是在编辑以前添加的项目时。返回到编辑 POST 的项目的 ID = 0,因此它会创建我尝试更新的数据的副本。

按下编辑链接时,它会将我带到正确的路线:

http://localhost:41250/Proyectos/Edit/1

GET IActionResult 接收正确的 id。

但是在编辑表单中,当我按下"保存"按钮时,在编辑的控制器 POST 部分中,它会收到一个项目,该项目拥有表单中除 id (ProyectoId) 为 0 之外的所有数据。

型:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace RegistroHora.Models
{
    public class Proyecto
    {
        [ScaffoldColumn(false)]
        [Key]
        public int ProyectoId { get; set; }
        [Required]
        public string Nombre { get; set; }
        [Required]
        [Display(Name ="Número de Horas")]
        public decimal NumHoras { get; set; }
        [Required]
        [Display(Name = "Tipo de Horas")]
        public string TipoHoras { get; set; }
        [Display(Name = "Proyecto Finalizado")]
        public bool Concluido { get; set; }
        public virtual ICollection<Registro> Registros { get; set; }
    }
}

视图:

@model RegistroHora.Models.Proyecto
@{
    ViewData["Title"] = "Edit";
}
<h2>Edit</h2>
<form asp-action="Edit">
    <div class="form-horizontal">
        <h4>Proyecto</h4>
        <hr />
        <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Nombre" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Nombre" class="form-control" />
                <span asp-validation-for="Nombre" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="NumHoras" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="NumHoras" class="form-control" />
                <span asp-validation-for="NumHoras" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="TipoHoras" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="TipoHoras" class="form-control" />
                <span asp-validation-for="TipoHoras" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <div class="checkboxs">
                    <input asp-for="Concluido" type="checkbox"> @Html.DisplayNameFor(i => i.Concluido)
                </div>
            </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>
<div>
    <a asp-action="Index">Back to List</a>
</div>
@section Scripts {
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
}

控制器:

using System.Linq;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Data.Entity;
using RegistroHora.Models;
namespace RegistroHora.Controllers
{
    public class ProyectosController : Controller
    {
        private ApplicationDbContext _context;
        public ProyectosController(ApplicationDbContext context)
        {
            _context = context;    
        }
        // GET: Proyectos
        public IActionResult Index()
        {
            return View(_context.Proyecto.ToList());
        }
        // GET: Proyectos/Details/5
        public IActionResult Details(int? id)
        {
            if (id == null)
            {
                return HttpNotFound();
            }
            Proyecto proyecto = _context.Proyecto.Single(m => m.ProyectoId == id);
            if (proyecto == null)
            {
                return HttpNotFound();
            }
            return View(proyecto);
        }
        // GET: Proyectos/Create
        public IActionResult Create()
        {
            return View();
        }
        // POST: Proyectos/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Create(Proyecto proyecto)
        {
            if (ModelState.IsValid)
            {
                _context.Proyecto.Add(proyecto);
                _context.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(proyecto);
        }
        // GET: Proyectos/Edit/5
        public IActionResult Edit(int? id)
        {
            if (id == null)
            {
                return HttpNotFound();
            }
            Proyecto proyecto = _context.Proyecto.Single(m => m.ProyectoId == id);
            if (proyecto == null)
            {
                return HttpNotFound();
            }
            return View(proyecto);
        }
        // POST: Proyectos/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Edit(Proyecto proyecto)
        {
            if (ModelState.IsValid)
            {
                _context.Update(proyecto);
                _context.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(proyecto);
        }
        // GET: Proyectos/Delete/5
        [ActionName("Delete")]
        public IActionResult Delete(int? id)
        {
            if (id == null)
            {
                return HttpNotFound();
            }
            Proyecto proyecto = _context.Proyecto.Single(m => m.ProyectoId == id);
            if (proyecto == null)
            {
                return HttpNotFound();
            }
            return View(proyecto);
        }
        // POST: Proyectos/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public IActionResult DeleteConfirmed(int id)
        {
            Proyecto proyecto = _context.Proyecto.Single(m => m.ProyectoId == id);
            _context.Proyecto.Remove(proyecto);
            _context.SaveChanges();
            return RedirectToAction("Index");
        }
    }
}

我对索引,创建,删除或详细信息没有问题,只有编辑。

ASP MVC 6 RC1 Edit 表单创建

您需要

从表单中传递ProyectoId值。您可以将其保存在表单内的隐藏字段中。

<form asp-action="Edit">
   <input type="hidden" asp-for="ProyectoId" />
   <!-- Your existing form fields for other properties goes here -->
   <input type="submit" value="Save" class="btn btn-default" />
</form>

另一种方法是更改方法 Edit 的签名,如下所示:

public IActionResult Edit(int id, Proyecto proyecto)

在这种情况下,您可以通过操作 URL 传递 id。在这种情况下,您需要将视图中的操作 URL 修改为:

<form asp-action="Edit" asp-route-id=@Model.ProyectoId>

当然,您需要支持 Id 作为参数的正确路由。

P.s. Id 你更喜欢第一种方法,只需从你的属性类中删除 [ScaffoldColumn(false)]。

由于编辑中的更新是围绕键(ProyectoId)的;你不能改变它;但是,它不会消失