通过视图模型向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
即使数据总是静态的,在视图模型中使用它之前,我真的需要使它成为非静态的并实例化类吗?
这不是有效的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" })
}