自动绑定模型属性(如果存在)
本文关键字:如果 存在 属性 绑定 模型 | 更新日期: 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;
}
这不会打破你目前的阶级结构。