通过视图模型向MVC3中的视图传递引用/静态数据

本文关键字:视图 引用 静态 数据 模型 MVC3 | 更新日期: 2023-09-27 17:59:04

我创建了一个类来保存一些静态数据:

static public class ReferenceData
    {
        [DisplayName("Status")]
        public IEnumerable<SelectListItem> StatusType
        {
            get
            {
                return new[]
                    {
                        new SelectListItem { Value = "0", Text = "Release" },
                        new SelectListItem { Value = "1", Text = "Beta" },
                        new SelectListItem { Value = "2", Text = "Alpha" },
                    };
            }
        }
    }

现在,我想使用该类数据来填充视图中的下拉列表。我有以下视图模型:

public class adminViewModel
{
    public HouseData   HouseData { get; set; }
    public string Status { get; set; }
    public ReferenceData ReferenceData { get; } // <<<<<< My problem here
}

@Html.DropDownListFor(
  x => x.Status,
  new SelectList(Model.ReferenceData.StatusType, "Value", "Text"),
  new { style = "display: inline;" }
)

对我来说,问题是我不确定这是否是一种有效的方法,因为我使用的是一个静态类,当我有get;在{}内部,它在编译过程中抱怨,并显示错误消息:

static types cannot be used as return types

即使数据总是静态的,在视图模型中使用它之前,我真的需要使它成为非静态的并实例化类吗?

通过视图模型向MVC3中的视图传递引用/静态数据

这不是有效的C#。您可以使用静态方法:

public static class ReferenceData
{
    public static IEnumerable<SelectListItem> GetStatusType()
    {
        return new[]
        {
            new SelectListItem { Value = "0", Text = "Release" },
            new SelectListItem { Value = "1", Text = "Beta" },
            new SelectListItem { Value = "2", Text = "Alpha" },
        };
    }
}

然后:

public class AdminViewModel
{
    public string Status { get; set; }
    [DisplayName("Status")]
    public IEnumerable<SelectListItem> Statuses
    {
        get
        {
            return ReferenceData.GetStatusType();
        }
    }
}

最后在视图中:

@Html.DropDownListFor(
    x => x.Status,
    new SelectList(Model.Statuses, "Value", "Text"),
    new { style = "display: inline;" }
)

您确定希望您的类是静态的而不是属性吗?如果您有一个静态属性,则不必创建实例来访问属性。更多信息:静态类和静态类成员(C#编程指南):

您想要这样做:

    public class ReferenceData
    {
        private static readonly SelectListItem[] Items = new[]
                {
                    new SelectListItem { Value = "0", Text = "Release" },
                    new SelectListItem { Value = "1", Text = "Beta" },
                    new SelectListItem { Value = "2", Text = "Alpha" },
                };
        [DisplayName("Status")]
        public IEnumerable<SelectListItem> StatusType
        {
            get { return Items; }
        }
    }

(在使用类实例时使项保持静态)。

您也可以使用singleton:

    public class ReferenceData
    {
        private static readonly ReferenceData _instance = new ReferenceData();
        private ReferenceData()
        {
        }
        public ReferenceData Instance { get { return _instance; } }
        [DisplayName("Status")]
        public IEnumerable<SelectListItem> StatusType
        {
            get
            {
                return new[]
                {
                    new SelectListItem { Value = "0", Text = "Release" },
                    new SelectListItem { Value = "1", Text = "Beta" },
                    new SelectListItem { Value = "2", Text = "Alpha" },
                };
            }
        }
    }

在你的模型中使用它:

public class adminViewModel
{
    public HouseData   HouseData { get; set; }
    public string Status { get; set; }
    public ReferenceData ReferenceData { get {return ReferenceData.Instance; } }
}

首先,像这样创建模型。。

public class ReferenceData
{
    public string SelectRuleId { get; set; }
    public IEnumerable<SelectListItem> StatusType
    {
        get
        {
            return new[]
            {
                new SelectListItem { Value = "0", Text = "Release" },
                new SelectListItem { Value = "1", Text = "Beta" },
                new SelectListItem { Value = "2", Text = "Alpha" },
            };
        }
    }
}

然后在任何控制器中创建新操作,如下所示。。

   public ActionResult About()
    {
        var model = new ReferenceData();
        ViewBag.Message = "DropDown Selected For ";
        return View(model);
    }

然后在操作视图中使用此Html。。。

@model MVCDropDownList.Models.AnswersViewModel
 @using (Html.BeginForm())  
    {  @Html.DropDownListFor(x => x.SelectRuleId , new SelectList(Model.StatusType, "Value", "Text"), new { id = "DId" })  
    }