ASP.net MVC 3编辑/删除问题

本文关键字:删除 问题 编辑 net MVC ASP | 更新日期: 2023-09-27 18:29:07

所以我刚刚在http://msdn.microsoft.com/en-us/data/gg685489.我正在尝试创建一个CRUD,用于已经存在的外部数据库,我只是将该项目作为我自己工作的指南。我已经能够更改某些变量名和连接,以连接到我尝试使用的数据库,我甚至使用索引方法显示了我想要的数据。我还能够让create方法发挥作用,并且能够在我正在使用的数据库中创建新的数据。不幸的是,我在使用Edit或Delete方法时无法拉入数据,或者在进行了所需更改后无法保存/删除数据。

例如,当我按下编辑按钮时,它应该拉取我点击的记录,这样我就可以编辑特定的记录信息,但它却抛出了一个错误,说这个变量不能接受null值,这就是为什么我在编辑-删除方法中将int改为字符串的原因 此部分已解决

我认为这个问题与"编辑"answers"删除"方法在我告诉它时没有提取记录集有关。有人知道为什么它在我编辑/删除时不提取记录集,或者在我告诉保存后保存我的更改吗?

我已经发布了我的PaController类,其中包含用于诊断的CRUD方法,以及我的iamp_mapping类文件,其中包含我需要使用的3个字段。我90%确信我的控制器出了问题,但如果你需要更多关于这个问题的代码/信息,请给我留言,我会经常回来查看,因为我太困了!非常感谢你的帮助!

Pa控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DBFirstMVC.Models;
using System.Data;
namespace DBFirstMVC.Controllers
{
    public class PaController : Controller
    {
        PaEntities db = new PaEntities();
        //
        // GET: /Pa/
        public ActionResult Index()
        {
            using (var db = new PaEntities())
            {
                return View(db.iamp_mapping.ToList());
            }
        }
        //
        // GET: /Pa/Details/5
        public ActionResult Details(int id)
        {
            return View();
        }
        //
        // GET: /Pa/Create
        public ActionResult Create()
        {
            return View();
        } 
        //
        // POST: /Pa/Create
        [HttpPost]
        public ActionResult Create(iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.iamp_mapping.Add(IAMP);
                    db.SaveChanges();
                }
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        //
        // GET: /Pa/Edit/5
        public ActionResult Edit(string id)
        {
            using (var db = new PaEntities())
            {
                return View(db.iamp_mapping.Find(id));
            }
        }
        //
        // POST: /Pa/Edit/5
        [HttpPost]
        public ActionResult Edit(string id, iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.Entry(IAMP).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch
            {
                return View();
            }
        }
        //
        // GET: /Pa/Delete/5
        public ActionResult Delete(string id)
        {
            using (var db = new PaEntities())
            {
                return View(db.iamp_mapping.Find(id));
            }
        }
        //
        // POST: /Pa/Delete/5
        [HttpPost]
        public ActionResult Delete(string id, iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.Entry(IAMP).State = EntityState.Deleted;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch
            {
                return View();
            }
        }
    }
}

iamp_映射

using System;
using System.Collections.Generic;
namespace DBFirstMVC.Models
{
    public partial class iamp_mapping
    {
        public string PA { get; set; }
        public string MAJOR_PROGRAM { get; set; }
        public string INVESTMENT_AREA { get; set; }
    }
}

编辑视图代码

@model DBFirstMVC.Models.iamp_mapping
@{
    ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>iamp_mapping</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.PA)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PA)
            @Html.ValidationMessageFor(model => model.PA)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.MAJOR_PROGRAM)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MAJOR_PROGRAM)
            @Html.ValidationMessageFor(model => model.MAJOR_PROGRAM)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.INVESTMENT_AREA)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.INVESTMENT_AREA)
            @Html.ValidationMessageFor(model => model.INVESTMENT_AREA)
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

索引.cshtml

@model IEnumerable<DBFirstMVC.Models.iamp_mapping>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            PA
        </th>
        <th>
            MAJOR PROGRAM
        </th>
        <th>
            INVESTMENT AREA
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.PA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MAJOR_PROGRAM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.INVESTMENT_AREA)
        </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.PA }) |
        @Html.ActionLink("Details", "Details", new { id=item.PA }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.PA })
    </td>
</tr>

}

ActionLink是我必须修复的,当我第一次发布这个问题时,它看起来像这个

@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ })

我将其更改为实际的主键PA,并删除了注释。这解决了试图编辑行时数据未填充的问题!

    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.PA }) |
        @Html.ActionLink("Details", "Details", new { id=item.PA }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.PA })
    </td>
</tr>

}

删除.cshtml

@model DBFirstMVC.Models.iamp_mapping
@{
    ViewBag.Title = "Delete";
}
<h2>Delete</h2>
<h3>Are you sure you want to delete this?</h3>
<fieldset>
    <legend>iamp_mapping</legend>
    <div class="display-label">PA</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.PA)
    </div>
    <div class="display-label">MAJOR_PROGRAM</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.MAJOR_PROGRAM)
    </div>
    <div class="display-label">INVESTMENT_AREA</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.INVESTMENT_AREA)
    </div>
</fieldset>
@using (Html.BeginForm()) {
    <p>
        <input type="submit" value="Delete" /> |
        @Html.ActionLink("Back to List", "Index")
    </p>
}

Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace DBFirstMVC
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Pa", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

ASP.net MVC 3编辑/删除问题

您在这里的问题是,当您单击编辑按钮/链接时,编辑操作将期望类型为int的id(如果您使用int),但是如果您使用了int?。。。这就是MVC的行为方式。。。你最好的选择是尝试使用url,比如http://urwebsite.com/Pa/Edit?id=[使用有效id]。。。有了这个,你将在编辑操作中有一个id。。。

更新

我认为您在这里遇到的问题是Edit操作方法中的Id值为null。。。MVC引擎无法从Url模式中识别id值

所以,在你有编辑链接/按钮的页面上,你可以使用类似的东西

<a href="/Pa/Edit/@model.id">Edit</a>

如果您有一个for循环,在其中显示记录的集合。。。

@foreach(var item in Model)

{

<a href="/Pa/Edit/@item.id">Edit</a>

}

还要确保您为url模式/Pa/Edit/{id}配置了路由

如果你想了解更多关于mvc中路由的信息,你可能想阅读这篇文章。

这将确保当向编辑操作方法发出Get请求时,id值将被识别为

希望这能帮助。。。

由于某种原因,我的链接无法获取id,所以我从一个课程中找到了解决方案。他补充了第五个论点";空";类似的功能

<td>@Html.ActionLink("Edit", "Edit", "Account", new {id = account.Id }, null)</td>(文本、操作、控制器、路由值、null或HTML属性)这为我修复了它。