C# ASP.NEt MVC编辑方法中的DropDownList

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

你好, 我正在用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 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();