【问题标题】:MVC Edit object doesn't workMVC 编辑对象不起作用
【发布时间】:2014-05-29 08:43:02
【问题描述】:

我正在使用实体框架,我有 2 个类:

    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();
}

在我看来,我不会把所有东西都放出来,这就是我所拥有的:

@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>
}

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

我在其他项目中使用了完全相同的 EditObject 方法,并且效果很好,包括下拉列表等等。

我错过了什么?

【问题讨论】:

  • model.SelectedPermissionGroup 的值,是您发布方法中的正确值
  • 希望我理解了您的问题,是的,在视图中它显示了我选择编辑的用户的正确权限组。当我在保存后放置断点时,model.SelectedPermissionGroup 被赋予了我更改为的正确权限。
  • 好吧,我想念你的问题,我认为它保存工作,当View(newModel);返回时它没有你所做的更改
  • 它永远不会到达 newModel,因为 'ModelState.IsValid' 是真的,所以它会中断 'return RedirectToAction("Index");'但我所做的更改没有保存。
  • 是否在某处调用了 SaveChanges,可能在 managerUser.EditObject(model.User); 内部?

标签: c# entity-framework model-view-controller


【解决方案1】:

我怀疑这是错误,您正在验证 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)

【讨论】:

  • 你能告诉我哪个属性发布为空吗??
  • User 类具有来自 EntityFramework 的属性:public virtual PermissionGroup PermissionGroup { get; set; } 所以 User.PermissionGroup 为空。
  • 表示 model.SelectedPermissionGroup 在编辑后操作中为空,对吗?
  • 否,model.SelectedPermissionGroup 正在正确获取选择的 id 权限组,并将 id 传递给 mode.User.PermissionGroupID 很好,但属性 PermissionGroup 仍然为空,并且没有进行任何更改.
  • @user2254436 你从来没有提到拥有PermissionGroup 属性的用户。无论如何,当您保存时,您只保存PermissionGroupID,当这种情况发生时,EF 不会自动加载导航属性......它会在下次加载用户时(懒惰地)加载它。
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多