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に設定されます。

実際のソリューションでは60以上のフィールドではエレガントではないため、フォームに非表示フィールドを実際に配置することはできませんIsPolicy。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 に答える