在 MVC2 中保存用户名 + EF4

发布于 2024-10-18 21:47:41 字数 457 浏览 2 评论 0原文

我正在使用 EF4 开发一个简单的 MVC2 项目。我还使用在控制器的构造函数中实例化的存储库模式。我有 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();
}

I am working on a simple MVC2 project with EF4. I am also using Repository pattern which is instantiated in the controller's constructor. I have 34 tables each with CreatedBy and LastModifiedBy fields that needs to populated when the record is saved.

Do you have other ideas on how to pass the username from the controller to the entity other than this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

马蹄踏│碎落叶 2024-10-25 21:47:41

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

像这样的东西:

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

You can create custom model binder that would set these two properties before action gets invoked.

Something like this:

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);
        }
    }
薄荷梦 2024-10-25 21:47:41

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

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

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

You can wrap this in repository. If all your entities share same fields you can define bass entity with those fields and derive other entities from this one (Table per concrete class hiearchy).

Then you can define base class for your repository like:

// 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;
     ...
  }
}

You can further improve this code by passing IIdentity directly to repository constructor or better by passing some custom Identity provider to repository constructor. Default provider implementation for web application will return identity from HttpContext.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文