C# MVC编辑对象不';行不通

C# MVC编辑对象不';行不通,c#,entity-framework,model-view-controller,C#,Entity Framework,Model View Controller,我使用的是实体框架,我有两个类: public class User { public int UserID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } publ

我使用的是实体框架,我有两个类:

    public class User
    {
            public int UserID { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Email { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public int PermissionGroupID { get; set; }
            public string Comments { get; set; }

            public virtual PermissionGroup PermissionGroup { get; set; }
    }

public class PermissionGroup
{
        public int PermissionID { get; set; }
        public string PermissionValue { get; set; }
}
当然,在我的数据库中,User.PermissionGroupID和PermissionGroup.PermissionID之间有FK

现在,我尝试使用UserModel编辑控制器和视图:

public class UserModel
{
    public User User { get; set; }
    public SelectList PermissionGroups { get; set; }
    public int SelectedPermissionGroup { get; set; }
}
使用控制器:

   public ActionResult Edit(int id = 0)
    {
        UserModel model = new UserModel ();
        model.User= managerUser.GetObjectById(id);
        model.PermissionGroups = new SelectList(managerPermission.GetAllList(), "PermissionID ", "PermissionValue");

        if (model.User== null)
        {
            return HttpNotFound();
        }

        model.SelectedPermissionGroup = model.User.PermissionGroupID;

        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(UserModel model)
    {
        if (ModelState.IsValid)
        {
            model.User.PermissionGroupID = model.SelectedPermissionGroup;
            managerUser.EditObject(model.User);
            return RedirectToAction("Index");
        }

        UserModel newModel = model;
        newModel.User = managerUser.GetObjectById(model.UserID);
        newModel.PermissionGroups = new SelectList(managerPermission.GetAllList(), "PermissionID ", "PermissionValue");

        return View(newModel);
    }
管理器中的EditObject如下所示:

public virtual int EditObject(T objToEdit)
{
    DbEntities.Set<T>().Attach(objToEdit);
    DbEntities.Entry(objToEdit).State = EntityState.Modified;
    return DbEntities.SaveChanges();
}
公共虚拟int-EditObject(T-objToEdit)
{
DbEntities.Set().Attach(objToEdit);
条目(objToEdit).State=EntityState.Modified;
返回DbEntities.SaveChanges();
}
在我看来,我不会把所有的东西都放进去,这就是我所拥有的:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>User</legend>

        @Html.HiddenFor(model => model.User.UserID)

//Everything else to edit about the user....

        <div class="form-group">
            @Html.LabelFor(model => model.User.PermissionGroupID)
            @Html.DropDownListFor(model => model.SelectedPermissionGroup, Model.PermissionGroups, new { @class = "form-control" })
            <p class="help-block">@Html.ValidationMessageFor(model => model.User.PermissionGroupID)</p>
        </div>

        <p>
            <input type="submit" value="Save" />
            @Html.ActionLink("Back", "Index")
        </p>
    </fieldset>
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
使用者
@Html.HiddenFor(model=>model.User.UserID)
//要编辑的有关用户的所有其他内容。。。。
@LabelFor(model=>model.User.PermissionGroupID)
@Html.DropDownListFor(model=>model.SelectedPermissionGroup,model.PermissionGroups,new{@class=“form control”})

@Html.ValidationMessageFor(model=>model.User.PermissionGroupID)

@ActionLink(“返回”、“索引”)

}
因此,根据我的断点,当我单击“保存”时,它会正确地传递所有内容,但用户类中的PermissionGroup属性不会作为PermissionGroupID填充(它会从所选下拉列表中接收ID)。 然后它返回到索引视图,但没有我所做的任何更改

我在其他项目中使用了完全相同的EditObject方法,使用dropdownlist和all时效果很好。


我遗漏了什么?

我怀疑这是个错误,您正在验证
Model.User.PermissionGroupID
,但您已将下拉列表绑定到
Model.SelectedPermissionGroup

@Html.DropDownListFor(model => model.SelectedPermissionGroup, 
                      Model.PermissionGroups, 
                      new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.User.PermissionGroupID)
应该是这样的:

@Html.DropDownListFor(model => model.User.PermissionGroupID, 
                               Model.PermissionGroups, 
                               new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.User.PermissionGroupID)

模型的值。SelectedPermissionGroup
是您的发布方法中的正确值。希望我在您的静止状态下,是的,在视图中,它显示了我选择编辑的用户的正确权限。保存后,当我放置断点时,模型。SelectedPermissionGroup将获得我更改为的正确权限。确定吗我不理解你的问题,我认为它是有效的,当
视图(newModel);
返回时,它没有你所做的更改,它永远不会到达新模型,因为'ModelState.IsValid'是真的,所以它在'return RedirectToAction》(“Index”)中中断;'但是我所做的更改没有保存。是否在某个地方调用了SaveChanges,可能在
managerUser.EditObject(model.User);
?您能告诉我哪个属性为null吗?用户类具有EntityFramework中的属性:
public virtual PermissionGroup PermissionGroup{get;set;}
so User.PermissionGroup为null。表示model.SelectedPermissionGroup在编辑后期操作权限中为null?否,model.SelectedPermissionGroup正在正确获取所选id权限组,并将id传递给mode.User.PermissionGroupID,但属性PermissionGroup仍然为null,并且未进行任何更改。@user2254436您从未见过用户具有
PermissionGroup
属性。无论如何,保存时仅保存
PermissionGroupID
,EF不会在发生这种情况时自动加载导航属性…它将在下次加载用户时(惰性地)加载该属性。