ASP MVC 6 RC1编辑表单创建

时间:2016-02-01 19:13:10

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

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

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

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

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

GET IActionResult收到正确的id。

但是在编辑表单中,当我按下“保存”按钮时,在编辑它的控制器POST部分中,收到一个包含表单中除了id(ProyectoId)为0的所有数据的proyecto。

型号:

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");
        }
    }
}

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

3 个答案:

答案 0 :(得分:0)

您需要传递表单中的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>

答案 1 :(得分:0)

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

public IActionResult Edit(int id, Proyecto proyecto)

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

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

对于cource,您需要支持Id作为参数的正确路由。

P.S。如果你喜欢第一种方法,只需从属性类中删除 [ScaffoldColumn(false)]

答案 2 :(得分:0)

由于编辑中的更新是围绕密钥(ProyectoId);你无法改变它;然而,不是让它消失