将用户名保存在MVC2 + EF4中

时间:2011-02-23 03:03:27

标签: asp.net-mvc entity-framework asp.net-mvc-2 entity-framework-4 httpcontext

我正在使用EF4开发一个简单的MVC2项目。我也在使用Repository模式,它在控制器的构造函数中实例化。我有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 个答案:

答案 0 :(得分:1)

您可以创建自定义模型绑定器,在调用操作之前设置这两个属性。

这样的事情:

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);
        }
    }

答案 1 :(得分:1)

您可以将其包装在存储库中。如果您的所有实体共享相同的字段,您可以使用这些字段定义低音实体,并从该字段中派生出其他实体(每个具体类层次表)。

然后您可以为您的存储库定义基类,如:

// 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直接传递给存储库构造函数或更好地将一些自定义Identity提供程序传递给存储库构造函数来进一步改进此代码。 Web应用程序的默认提供程序实现将从HttpContext返回标识。