1

次のようないくつかのプロパティを使用して基本クラスを定義しました。

public string CreatedByName { get; set; }
public DateTime CreatedOn { get; set; }

public string UpdatedByName { get; set; }
public DateTime UpdatedOn { get; set; }

コントローラで次のように、この基本クラスから継承するモデルオブジェクトを作成する場合:

[HttpPost]
public ActionResult Create(Person person)
{
    if (ModelState.IsValid)
    {
        person.Id = Guid.NewGuid();

        //audit information
        person.UpdatedByName = User.Identity.Name;
        person.UpdatedOn = DateTime.Now;
        person.CreatedByName = User.Identity.Name;
        person.CreatedOn = DateTime.Now;            

        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(person);
}

この段階では監査プロパティがまだ設定されていないため、ModelState.IsValidいつものように機能することはありません。false

この種の値を一般的な場所に設定する方法はありますか(ヘルパークラスを作成しようとしましたが、取得方法はUser?)、モデルの検証が始まる前に設定しますか?

または、唯一の選択肢は、監査プロパティをnullabeにすることです[必須ではありません]?

編集:-

@archilの提案を試しました:

HAHAHAH.........これをGet実行してください

public ActionResult Create()
{
    var person=new Person();
    person.UpdatedByName = User.Identity.Name;
    person.UpdatedOn = DateTime.Now;
    person.CreatedByName = User.Identity.Name;
    person.CreatedOn = DateTime.Now;

    return View(person);

まだ取得中:

  • CreatedOnフィールドは必須です。
  • RefreshedOnフィールドは必須です。
4

1 に答える 1

2

そのため、ドメインモデルではなく、コントローラーアクションでViewModelsを使用する必要があります。Viewmodelには、人物の作成に必要なプロパティのみが含まれ、後で検証済みのモデルで監査と他のすべての値を設定できます。

[HttpPost]
public ActionResult Create(CreatePersonViewModel createPerson)
{
    if (ModelState.IsValid)
    {
        Peron person = MapViewModel(createPerson);

        //audit information
        person.UpdatedByName = User.Identity.Name;
        person.UpdatedOn = DateTime.Now;
        person.CreatedByName = User.Identity.Name;
        person.CreatedOn = DateTime.Now;            

        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(createPerson);
}

マッピングには、広く使用されているAutoMapperなどを使用できます。

アップデート

Controller.UpdateModelまたはController.TryUpdateModelを使用して、モデルのバインドと検証を手動で呼び出すことができます

このようなもの

[HttpPost]
public ActionResult Create()
{
    Person person = new Person();
    person.UpdatedByName = User.Identity.Name;
    person.UpdatedOn = DateTime.Now;
    person.CreatedByName = User.Identity.Name;
    person.CreatedOn = DateTime.Now;    


    if (TryUpdateModel(person))
    {
        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(person );
}
于 2012-10-21T16:13:40.203 に答える