C# ASP.NEt MVC编辑方法中的DropDownList
你好, 我正在用SQL Server 2012和EF包编写asp.net mvc3项目,我正在使用dropdownlist在数据库中创建和更新条目。当我添加页面时,一切正常,但当我尝试编辑时,它无法保存更改。我试着使用brackpoint,在调试模式下,内部异常告诉我C# ASP.NEt MVC编辑方法中的DropDownList,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,你好, 我正在用SQL Server 2012和EF包编写asp.net mvc3项目,我正在使用dropdownlist在数据库中创建和更新条目。当我添加页面时,一切正常,但当我尝试编辑时,它无法保存更改。我试着使用brackpoint,在调试模式下,内部异常告诉我 Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modifie
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
这是我的代码:
[Table("Pages", Schema = "myprojectname")]
[Bind(Exclude = "PageId")]
public class Page
{
public int PageId { get; set; }
public string PageContent { get; set; }
public int PageTitleId { get; set; }
public virtual PageTitle PageTitle { get; set; }
}
[Table("PageTitles", Schema = "myprojectname")]
public class PageTitle
{
public int PageTitleId { get; set; }
public string Title { get; set; }
public List<Page> Pages { get; set; }
}
public DbSet<Page> Pages { get; set; }
public DbSet<PageTitle> PageTitles { get; set; }
public ActionResult PageEdit(int id)
{
Page page = context.Pages.Find(id);
ViewBag.PageTitleId = new SelectList(context.PageTitles, "PageTitleId", "Title", page.PageTitleId);
return View(page);
}
[HttpPost]
[ValidateInput(false)]
public ActionResult PageEdit(Page page)
{
try
{
if (ModelState.IsValid)
{
context.Entry(page).State = EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index", "Administrator");
}
}
catch (DataException)
{
ModelState.AddModelError("", "Unable to save changes. Please try again");
}
ViewBag.PageTitleId = new SelectList(context.PageTitles, "PageTitleId", "Title", page.PageTitleId);
return View(page);
}
@model BalticCenter.Web.Models.Entities.SitePages.Page
@{
ViewBag.Title = "PageEdit";
Layout = "~/Views/Shared/_AdministratorLayout.cshtml";
}
<h2>PageEdit</h2>
[表(“页面”,Schema=“myprojectname”)]
[绑定(Exclude=“PageId”)]
公共类页面
{
public int PageId{get;set;}
公共字符串PageContent{get;set;}
public int PageTitleId{get;set;}
公共虚拟页面标题页面标题{get;set;}
}
[表(“页面标题”,Schema=“myprojectname”)]
公共类页面标题
{
public int PageTitleId{get;set;}
公共字符串标题{get;set;}
公共列表页{get;set;}
}
公共数据库集页面{get;set;}
公共数据库集页面标题{get;set;}
公共操作结果页面编辑(int id)
{
Page=context.Pages.Find(id);
ViewBag.PageTitleId=新建选择列表(context.PageTitleId,“PageTitleId”,“Title”,page.PageTitleId);
返回视图(第页);
}
[HttpPost]
[验证输入(错误)]
公共操作结果页面编辑(第页)
{
尝试
{
if(ModelState.IsValid)
{
context.Entry(page.State=EntityState.Modified;
SaveChanges();
返回重定向操作(“索引”、“管理员”);
}
}
捕获(数据异常)
{
ModelState.AddModelError(“,”无法保存更改。请重试”);
}
ViewBag.PageTitleId=新建选择列表(context.PageTitleId,“PageTitleId”,“Title”,page.PageTitleId);
返回视图(第页);
}
@模型BalticCenter.Web.Models.Entities.SitePages.Page
@{
ViewBag.Title=“页面编辑”;
Layout=“~/Views/Shared/_AdministratorLayout.cshtml”;
}
页面编辑
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
页
@Html.HiddenFor(x=>x.PageId)
@LabelFor(model=>model.PageTitleId,“PageTitle”)
@DropDownList(“PageTitleId”,String.Empty)
@Html.ValidationMessageFor(model=>model.PageTitleId)
@LabelFor(model=>model.PageContent)
@Html.TextAreaFor(model=>model.PageContent)
@Html.ValidationMessageFor(model=>model.PageContent)
}
@ActionLink(“返回列表”、“索引”)
我看不出我的错误。有什么想法吗?您的课堂页面装饰有[Bind(Exclude=“PageId”)] 这意味着当您将EntityState设置为Modified时,该实体没有基本密钥(id) 因此,数据库无法保存更改这一项可能有帮助:
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Page</legend>
@Html.HiddenFor(x => x.PageId)
<div class="editor-label">
@Html.LabelFor(model => model.PageTitleId, "PageTitle")
</div>
<div class="editor-field">
@Html.DropDownList("PageTitleId", String.Empty)
@Html.ValidationMessageFor(model => model.PageTitleId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PageContent)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.PageContent)
@Html.ValidationMessageFor(model => model.PageContent)
</div>
<p>
<input type="submit" value="Edit" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
context.Entry(page).State = EntityState.Modified;
context.SaveChanges();