自动绑定模型属性(如果存在)

本文关键字:如果 存在 属性 绑定 模型 | 更新日期: 2023-09-27 18:26:46

我不确定我是否知道我想做什么的确切术语,所以我只描述我想要什么,希望有人能给我答案或指引我去正确的地方。。。

我希望我的网站上的一些(也许所有)模型能够继承IGeneralSettings-

public interface IGeneralSettings
{
    User CurrentUser { get; set; }
    UserSettings PersonalSettings { get; set; }
}

如果当前用户已通过身份验证/登录,我将检查当前控制器的模型是否属于实现IGeneralSettings的类型,如果是,我将用当前用户数据填充数据。

我正在使用温莎城堡作为IoC集装箱
我不想用财产袋
我不想在每个控制器的每个操作中调用一个这样做的方法,我希望在每个请求中自动注入这个方法——这意味着这个代码将写一次。

这可能吗?

自动绑定模型属性(如果存在)

我建议将CurrentUser和PersonalSettings对象添加到基本控制器中,并在每个请求中填充(如果它们经过身份验证)。然后您可以在自定义模型绑定器中访问它们,因为您可以访问控制器上下文。

一种方法的例子:

控制器继承的基本控制器

public class BaseController : Controller
{
    public BaseController()
    {
        //You can load the CurrentUser and Settings here
        CurrentUser = new User
        {
            Id = 1
        };
        PersonalSettings = new UserSettings
        {
            Id = 1
        };
    }
    public User CurrentUser { get; set; }
    public UserSettings PersonalSettings { get; set; }
}

ModelBinder

public class ThingModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext,
                                ModelBindingContext bindingContext)
      {
        var model = (Thing)base.BindModel(controllerContext, bindingContext);
        var baseController = controllerContext.Controller as BaseController;
        if (baseController != null)
        {
            model.CurrentUser = baseController.CurrentUser;
            model.PersonalSettings = baseController.PersonalSettings;
        }
        return model;
      }
}

在Global.asax的Application_Start中添加ModelBinder

ModelBinders.Binders.Add(typeof(Thing), new ThingModelBinder());

控制器

public class HomeController : BaseController
{
    [HttpPost]
    public ActionResult Save(Thing model)
    {
        //model has CurrentUser and PersonalSettings set 
        //without any values being posted. 
        //You can also access the values on the BaseController 
        //if you don't want to automatically bind it.
        return View();
    }
}

我在上一个项目中找到的另一种方法:定义控制器的扩展方法,如:

public static Models.User GetUser(this Controller controller)
    {
        string name = controller.User.Identity.Name;
        string alias = name.Substring(name.LastIndexOf('''') + 1);
        string domain = name.Substring(0, name.IndexOf('''') - 1);
        User user = User.ByAlias(alias);
        if (user == null)
        {
            user = new User();
            user.Name = controller.User.Identity.Name;
            user.Alias = alias;
            user.Domain = domain;
            user.Description = "Automatically registered";
            Guid userId = Models.User.Create(user, Guid.Empty);
            user = User.ByAlias(alias);
        }
        return user;
    }

这不会打破你目前的阶级结构。