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" })
}