Как установить свойства модели в процессе привязки модели? - PullRequest
1 голос
/ 08 июля 2010

Многие из моих объектов модели наследуются от класса AuditedEntity, который отслеживает изменения в объекте.Я хотел бы, чтобы объекты моей модели, которые наследуются от AuditedEntity, автоматически заполняли соответствующие поля при построении в процессе привязки модели.Я искал подклассификацию связующего по умолчанию для модели, но без особой удачи.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Заполнены ли эти свойства известными значениями или значениями из хорошего источника.Или эти свойства заполнены значениями, зависящими от значений из формы / маршрута / запроса и т. Д.?

Подклассификация DefaultModelBinder должна подойти, например:

public class MyModel
{
  public string Forename { get; set }

  public string SomeSpecialProperty { get; set; }
}

public MyModelBinder : DefaultModelBinder
{
  public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    var model = (MyModel)base.BindModel(controllerContext, bindingContext);

    model.SomeSpecialProperty = // Do something here...

    return model;
  }
}

ModelBinder.Binders[typeof(MyModel)] = new MyModelBinder();

Что вы нашли к настоящему моменту?

0 голосов
/ 08 июля 2010

Мне пришлось положиться на все связанные данные.Это было решение, которое я в конечном итоге использовал.размещение кода в OnModelUpdated позволило мне положиться на другие установленные свойства.

public class AuditedEntityModelBinder : DefaultModelBinder
{

    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType.IsSubclassOfGeneric(typeof(AuditedEntity<>)))
        {
            string name = controllerContext.HttpContext.User.Identity.Name;

            if(!name.IsNullOrEmpty())
            {
                if((bool) bindingContext.ModelType.GetProperty("IsNew").GetValue(bindingContext.Model, null))
                {
                    bindingContext.ModelType.GetProperty("CreatedBy").SetValue(bindingContext.Model, name, null);
                    bindingContext.ModelType.GetProperty("Created").SetValue(bindingContext.Model, DateTime.Now, null);
                }
                else
                {
                    bindingContext.ModelType.GetProperty("ModifiedBy").SetValue(bindingContext.Model, name, null);
                    bindingContext.ModelType.GetProperty("Modified").SetValue(bindingContext.Model, DateTime.Now, null);
                }

            } 
        }

        base.OnModelUpdated(controllerContext, bindingContext);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...