自動的に入力する必要があるすべてのプロパティとのインターフェースを用意します。
public interface ISelectFields
{
public IEnumerable<SelectListItem> FooDdl { get; set; }
}
これらのプロパティを必要とするすべてのビュー モデルで、そのインターフェイスを実装します。
public class MyVM : ISelectFields
{
public IEnumerable<SelectListItem> FooDdl { get; set; }
}
を持ってBaseController
、オーバーライドし、渡された をOnResultExecuting
見つけてViewModel
、プロパティをインターフェイスに注入します。
public class BaseController : Controller
{
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
var viewResult = filterContext.Result as ViewResult;
if (viewResult != null)
{
var viewModel = viewResult.Model as ISelectFields;
if (viewModel != null)
{
viewModel.FooDdl = fooRepository.GetAll().ToSelectList(x => x.Id, x => x.Name)
}
}
base.OnResultExecuting(filterContext);
}
}
これで、コントローラーは非常にシンプルになり、すべてが厳密に型指定され、DRY 原則に固執し、そのプロパティの入力を忘れることができます。コントローラーが から継承し、インターフェースBaseController
をViewModels
実装している限り、常にビューで使用できます。 .
public class HomeController : BaseController
{
public ActionResult Index()
{
MyVM vm = new MyVM();
return View(vm); //you will have FooDdl available in your views
}
}