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);
}
}
}
您在这里的问题是,当您单击编辑按钮/链接时,编辑操作将期望类型为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属性)这为我修复了它。