Сохранение имени пользователя в MVC2 + EF4 - PullRequest
3 голосов
/ 23 февраля 2011

Я работаю над простым проектом MVC2 с EF4.Я также использую шаблон репозитория, который создается в конструкторе контроллера.У меня есть 34 таблицы, каждая с полями CreatedBy и LastModifiedBy, которые необходимо заполнить при сохранении записи.

Есть ли у вас другие идеи о том, как передать имя пользователя от контроллера к объекту, отличному от этого:

[HttpPost]
public ActionResult Create(){

     Record rec = new Record();
     TryUpdateModel(rec);
     rec.CreatedBy = HttpContext.Current.User.Identity.Name;
     rec.LastModifiedBy = HttpContext.Current.User.Identity.Name; 
     repository.Save();

     return View();
}

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Вы можете обернуть это в хранилище. Если все ваши сущности имеют одни и те же поля, вы можете определить басовую сущность с этими полями и извлечь из нее другие сущности (Таблица для конкретного класса hiearchy).

Затем вы можете определить базовый класс для вашего хранилища, например:

// Other repositories derive from this repository
// BaseEntity is parent of all your entities and it has your shared fields
public abstract class BaseRepository<T> where T : BaseEntity
{
  ....
  public void Save(IIdentity user, T entity)
  {
     entity.CreatedBy = user.Name;
     entity.LastModifiedBy = user.Name;
     ...
  }
}

Вы можете дополнительно улучшить этот код, передав IIdentity непосредственно в конструктор хранилища или, что еще лучше, передав некоторый пользовательский поставщик удостоверений в конструктор хранилища. Реализация провайдера по умолчанию для веб-приложения возвращает идентификатор из HttpContext.

1 голос
/ 23 февраля 2011

Вы можете создать пользовательский механизм связывания модели, который установит эти два свойства до вызова действия.

Примерно так:

public class CustomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
        {
            if ((propertyDescriptor.Name == "CreatedBy") || (propertyDescriptor.Name == "LastModifiedBy"))
            {
                //set value
            }
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }
    }
...