- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一类属性,这些属性是从我需要在我的 MVC 应用程序的每个 View 上都可用的服务中设置的。
因此,我创建了一个“基础 View 模型”,我的 View 模型将从中继承。
public class BaseModel
{
public BaseModel()
{
foo = "foo value";
bar = "bar value";
}
public string foo { get; set; }
public string bar { get; set; }
}
public class HomeIndexViewModel : BaseModel
{
}
然后我创建了一个“基础 Controller ”,我的所有 Controller 都将继承自它:
public class BaseController : Controller
{
public BaseController()
{
}
}
public class HomeController : BaseController
{
public ActionResult Index()
{
HomeIndexViewModel model = new HomeIndexViewModel();
return View(model);
}
}
这按预期工作,我可以在我的 View 中调用 @Model.foo
并获取 foo 值
。
但是我认为我不应该在它的构造函数中初始化 BaseModel
的值,因为这没有使用依赖注入(inject)并且将变得难以进行单元测试。
如何将值 foo
和 bar
的设置移动到 BaseController
中?
当然,我可以在 HomeController
中设置值,但我宁愿从 Controller 中抽象它,因为逻辑总是相同的,并且会使我的所有 Controller 膨胀。
最佳答案
我认为问题在于您正在操作 中创建模型的实例,因此基本 Controller 没有引用对象来设置属性。
就我个人而言,我可能会在负责根据需要创建模型的基本 Controller 中选择一些“工厂类型”功能。
例如:
public class BaseController : Controller
{
public T CreateBaseModel<T>() where T : BaseModel, new()
{
return new T
{
foo = "foo value",
bar = "bar value"
};
}
}
然后当您在操作中创建模型时,您可以这样做:
HomeIndexViewModel model = CreateBaseModel<HomeIndexViewModel>();
如果出于某种原因您需要将参数传递给您的模型构造函数,那么您可以像这样重载:
public T CreateBaseModel<T>(params object[] args) where T : BaseModel
{
T model = (T)Activator.CreateInstance(typeof(T), args);
model.foo = "foo";
return model;
}
HomeIndexViewModel model = CreateBaseModel<HomeIndexViewModel>(param1, param2, etc);
备选
上述方法的主要好处是您可以访问操作代码中的 foo
和 bar
属性。但是,如果您不关心这一点并且只需要从 View 页面中访问这些值,那么您可以覆盖 OnActionExecuted
方法并在其中应用这些值。这种方法的好处是您无需更改在操作中创建模型的方式...
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
BaseModel model = filterContext.Controller.ViewData.Model as BaseModel;
if (model != null)
{
model.foo = "foo value";
model.bar = "bar value";
}
base.OnActionExecuted(filterContext);
}
在那里检查 null
意味着它只会尝试应用从 BaseModel
继承的模型的值,这意味着您仍然可以放心地使用其他模型。
通过这种方法,您的操作代码可以恢复到原来的样子:
HomeIndexViewModel model = new HomeIndexViewModel();
return View(model);
关于c# - 如何在 BaseController 中初始化 BaseModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032457/
我是一名优秀的程序员,十分优秀!