asp.net-mvc – 如何使用ASP.NET MVC中的基本控制器创建一个强类型的母版页
|
按照 NerdDinners的例子,我有兴趣创建一个强类型的主页。为了实现这一点,我使用一个基本控制器来检索主页面的数据。所有其他控制器继承此类。类似地,我有主页面和任何其他视图的ViewModels。 ViewModel类的视图继承自主页面的ViewModel。 题 子控制器应如何确保将母版页的数据传递给视图,而不设置与主页本身相关的ViewModel的属性? 我的主页面将显示一些按钮,这些按钮是在XML文件中确定的,因此我正在填充的Buttons类。 MasterPage ViewModel代码段 using System.Collections.Generic;
namespace Site1.Models
{
public class MasterViewModel
{
public List<Button> Buttons{set; get;}
}
}
查看ViewModel namespace Site1.Models
{
public class View1ViewModel : MasterViewModel
{
public SomeDataClass SomeData { get; set; }
}
}
基控制器 using System.Collections.Generic;
using System.Web.Mvc;
using Site1.Models;
namespace Site1.Controllers
{
public abstract class BaseController : Controller
{
protected MasterViewModel model = new MasterViewModel();
public BaseController()
{
model.Buttons = new List<Button>();
//populate the button classes (doesn't matter how)
PopulateButtons(model.Buttons);
}
}
}
视图的控制器: using System.Web.Mvc;
namespace Site1.Controllers
{
public class View1Controller : BaseController
{
public ActionResult Index()
{
Models.View1ViewModel viewModel = new Models.View1ViewModel();
SomeDataClass viewData = new SomeDataClass()
//populate data class (doesn't matter how)
PopulateDataClass(viewData);
viewModel.SomeData = viewData;
//I WANT TO ELIMINATE THE FOLLOWING LINE!
viewModel.Buttons = model.Buttons;
return View("Index",viewModel);
}
}
}
母版页继承了System.Web.Mvc.ViewMasterPage< Site1.Models.MasterViewModel> ;. 视图继承了System.Web.Mvc.ViewMasterPage< Site1.Models.View1ViewModel> ;. 解决方法您可以创建一个动作后执行的过滤器,该过滤器查找该类型的模型,并相应地设置属性,也许通过调用基本控制器功能。然后,您将过滤器放在基类上,所有操作将自动查看。动作过滤器属性获取控制器的ViewModel,并将其传递给控制器的SetModel函数: using System.Web.Mvc;
using Site1.Controllers;
namespace Site1.Models
{
public class MasterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
MasterViewModel viewModel = (MasterViewModel)((ViewResultBase)filterContext.Result).ViewData.Model;
BaseController controller = (BaseController)filterContext.Controller;
controller.SetModel(viewModel);
}
}
}
此功能添加到BaseController中: public void SetModel(MasterViewModel childViewModel)
{
childViewModel.Buttons = model.Buttons;
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 为什么GET方法比POST快?
- asp.net-mvc – ASP MVC 3在不同的视图中使用不同的布局
- asp.net – ASPNET WebForms服务器控件在Page_Load中为NULL
- asp.net-mvc – ASP.NET MVC 5自定义错误页面
- asp.net-mvc – 为什么我的HttpConfiguration类型没有使用.
- asp.net – Jquery datepicker:验证日期mm/dd/yyyy
- ASP.NET CheckBoxList DataBinding问题
- asp.net-mvc – 让System.Web.Optimization在类库中的剃刀视
- asp.net – $(“#dialog”).parent().appendTo($(“form:f
- asp.net-mvc – 如何在ASP.NET MVC中生成弹出页面链接
- asp.net-mvc-3 – MVC3 = return EmptyResult()当
- asp.net – Xdocument不打印声明
- asp.net – Silverlight初始化错误2110 Internet
- asp.net-mvc-3 – 在MVC 3的浏览器选项卡中打开P
- asp.net-mvc – 注销后,如果浏览器返回按钮,那么
- asp.net-mvc-3 – 如何从部分视图将JavaScript渲
- asp.net-mvc – AppDomain.GetAssemblies和Build
- asp.net-mvc – 可靠地处理ASP.NET MVC模型绑定错
- asp.net – WebForms中的Tabbing行为
- 从ASP.NET Core连接到SQL Server的最佳实践?
