0

我目前遇到了一个问题,我需要查看编辑字段上哪些字段已更改以用于审计目的,其中我有代码,但我认为我的问题出在我的 MVC 视图中。

我有(测试代码):

[HttpPost]
public ActionResult Adjustment(GroupPolicy groupPolicy)
{
          if (ModelState.IsValid)
          {
              _service.SaveGroupPolicy(groupPolicy);
              return RedirectToAction("Index");
          }
          return View(groupPolicy);
}

这很好,政策节省了。但是,请考虑到这一点:

GroupPolicy 有 3 个字段(实际上可能有 60 个):

bool IsPolicy
string Name
string Description

名称和描述在表格上,所以没关系。IsPolicy 未在表单上使用,因此当在 Adjustment 方法中发布回 GroupPolicy 对象时默认为 false 。

我真的不能IsPolicy在表单上添加一个隐藏字段,因为在我的实际解决方案中,这对于 60 多个字段来说并不优雅,HTML 会到处都是。

现在 bool 默认为 false,它完全消除了我知道该字段是否已更改的机会。我真正想要的是一种保留这些数据的方法,同时将新信息保留在编辑表单上。

这可能吗,我是否遗漏了一些明显的东西?

4

2 回答 2

2

首先,GroupPolicy应该是视图模型而不是实体 - 因此它应该为视图量身定制,例如

public class GroupPolicyViewModel
{
    [HiddenInput]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    ...
}

然后在您的操作中,您无需担心分配已更改的值,您只需将视图模型直接映射到例如

public ActionList Adjustment(GroupPolicyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // pull actual entity from service
        var groupPolicy = _service.GetGroupPolicy(viewModel.Id);
        // update entity from view model
        groupPolicy.Name = viewModel.Name;
        groupPolicy.Description = viewModel.Description;
        ...
    }
}

这使您的视图和业务逻辑保持清晰的分离。此外,它还允许您为客户端验证添加注释,而不会影响您的真实模型。

GroupPolicy 有 3 个字段(实际上可能有 60 个)

我建议为此使用AutoMapper,例如

// call this once only e.g. Application_Start in the Global.asax
Mapper.CreateMap<GroupPolicyViewModel, GroupPolicy>();
...
// in your Adjustment action
var groupPolicy = _service.GetGroupPolicy(viewModel.Id);
groupPolicy = Mapper.Map<GroupPolicyViewModel, GroupPolicy>(viewModel, groupPolicy);
_service.SaveGroupPolicy(groupPolicy);
于 2013-01-08T13:20:06.733 回答
1

如果IsPolicy不在表单上,​​那么它甚至不应该是您模型的一部分 - 这将阻止将此字段发布到您的模型中,因此 IsPolicy 甚至不需要您的检查。

与其将其作为参数接受到操作中,不如创建一个仅包含表单上字段GroupPolicy的缩减对象。GroupPolicyInputModel

然后使用您的通用审核仅比较所有已发布的字段,就像任何其他形式一样。

于 2013-01-08T13:19:44.223 回答