Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过viewmodel将引用/静态数据传递到MVC3中的视图_C#_Asp.net Mvc - Fatal编程技术网

C# 通过viewmodel将引用/静态数据传递到MVC3中的视图

C# 通过viewmodel将引用/静态数据传递到MVC3中的视图,c#,asp.net-mvc,C#,Asp.net Mvc,我创建了一个类来保存一些静态数据: static public class ReferenceData { [DisplayName("Status")] public IEnumerable<SelectListItem> StatusType { get { return new[] {

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

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 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" },
            };
        }
    }
}

即使数据始终是静态的,我是否真的需要将其设置为非静态并实例化该类,然后才能在viewmodel中使用它?

是否确实希望您的类是静态的而不是属性?如果您有一个静态属性,那么不必创建实例来访问属性。更多信息::

要执行此操作:

    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; }
        }
    }
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 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 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 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" },
            };
        }
    }
}
然后在动作视图中使用此Html

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" },
            };
        }
    }
}
@model MVCDropDownList.Models.AnswersViewModel

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

我想使这个类成为静态的,这样就不必实例化它了。这是正确的说法吗?我从类中删除了static,并将static添加到status类型中。然后在视图模型中,我得到一条不同的消息:……ReferenceData.get’必须声明一个主体,因为它没有标记为抽象或外部。自动实现的属性必须同时定义get和set访问器。请将属性设置为静态,而不是class@DavidH如果希望ReferenceData是自动实现的只读属性,那么应该编写公共ReferenceData ReferenceData{get;private set;}。我现在就试试这个。谢谢你,你的回答很好。只有一个问题。如何在C#程序中访问StatusType。我尝试执行var data1=newreferencedata();但它会出现一条错误消息:由于其保护级别,引用数据无法访问。
var data=ReferenceData.Instance.StatusType
,但此类数据应位于viewbag、viewdata或tempdata中。除了viewmodel之外的任何地方。这些数据与模型无关。@nathan gonzalez,ViewBag和ViewData是ASP.NET MVC中最邪恶的东西。对我来说,这种数据绝对不应该存在。TempData,我不知道=>在一些罕见的情况下,这可能是有用的。我认为您的意思是,这些数据可以硬编码到存储库方法中,控制器操作查询该存储库方法以填充模型。那么我同意你的看法。存储库中的硬代码?我想我永远不会那样做。为什么您会讨厌viewbag和viewdata。这类数据正是它们设计的目的。viewmodel用于views模型,该数据显然不是其中的一部分。@nathan gonzalez,是的,我会有一个我的存储库接口的实现,例如调用
AdminOptionsMemory
,因为例如我没有数据库,我不想将这些值存储在文件中,我只想将它们存储在内存中。就ViewBag/ViewData而言,它们会在视图中引入弱类型,如果使用它们,则意味着不使用强类型视图和视图模型,如果使用它们,则无法获得Intellisense,如果使用它们,则需要在视图中执行强制转换,以便调用方法的适当重载。。。我可以继续讲下去,我不是说你不应该使用强类型视图,我完全支持将viewmodel用于与模型相关的视图数据。我得到了弱类型的问题,但是对于视图模型中不存在的数据,viewdata是放置它的地方。我想我同意不同意。
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);
    }
@model MVCDropDownList.Models.AnswersViewModel

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