加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何使用ASP.NET MVC中的基本控制器创建一个强类

发布时间:2020-12-15 18:31:42 所属栏目:asp.Net 来源:网络整理
导读:按照 NerdDinners的例子,我有兴趣创建一个强类型的主页。为了实现这一点,我使用一个基本控制器来检索主页面的数据。所有其他控制器继承此类。类似地,我有主页面和任何其他视图的ViewModels。 ViewModel类的视图继承自主页面的ViewModel。 题 子控制器应如
按照 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&gt ;. 视图继承了System.Web.Mvc.ViewMasterPage< Site1.Models.View1ViewModel&gt ;.

解决方法

您可以创建一个动作后执行的过滤器,该过滤器查找该类型的模型,并相应地设置属性,也许通过调用基本控制器功能。然后,您将过滤器放在基类上,所有操作将自动查看。

动作过滤器属性获取控制器的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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读