我目前正在尝试使用我认为的硬编码值来实现下拉列表。基本上我想要的是有一个下拉列表,可以选择三个可能的值。
我总共有4个控制器和视图将使用此下拉列表。我已经看过很多关于MVC2和MVC3的例子,人们在他们的观点中对他们的下拉列表进行了硬编码,而我个人并不喜欢快速使用"脏"解决这个问题。
我有一个包含以下内容的模型。
public class Status
{
public int id { get; set; }
public string status { get; set; }
public Status(int statusId, string statusName)
{
id = statusId;
status = statusName;
}
}
状态应该能够包含3个可能的值中的任何一个:
Active
Inactive
Processing
我想到了创造状态'使用这种方法我目前在我的状态类中:
public static List<Status> getAllStatus()
{
List<Status> states = new List<Status>();
states.Add(new Status(1, "Active"));
states.Add(new Status(2, "Inactive"));
states.Add(new Status(3, "Processing"));
return states;
}
我还没有弄清楚如何在我的控制器中使用这个模型以及如何将它传递给我的视图,并希望有人在这里知道如何做到这一点?
我想我忘了提到我将所选值存储为数据库中的字符串,并且我使用的视图不具有我的状态类的模型,而是使用对象的模型我将存储在我的数据库中(可能是车辆对象的情况)。
我有一个名为Customer的模型,它具有以下某些值:
public int CustomerID { get; set }
public string Email { get; set }
public string Phone { get; set }
public Status Status { get; set; }
在我的客户模型的数据库中,我有一个字符串,我要在其中存储所选的状态。
所以基本上我不想将以下内容更改为包含3个选项的下拉列表,Inactive
,Active
和Processing
。
但是我不想在我的视图中对此进行编码,因为我将需要在8个不同的视图中进行编码并复制不是非常光滑代码的粘贴。
答案 0 :(得分:1)
@Html.DropDownListFor(m => m.status_id, new SelectList(getAllStatus(), "id", "status"))
答案 1 :(得分:1)
希望这有用。所以开始你有很多关于vage的问题。如果可以,请更具体。如果您不知道MVC如何运作良好,我会建议您遵循一些教程。
Model.cs(首选ViewModel)。您应该创建一个传递给View的ViewModel。以下是如何获取项目列表的示例。
public int SelectedStatusId { get; set; }
[DisplayName("Status")]
public IEnumerable<SelectListItem> StatusItems
{
get
{
yield return new SelectListItem { Value = "", Text = "- Select a status -" };
StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum));
foreach (StatusTypeEnum item in values)
{
if (item != StatusTypeEnum.Unknown)
{
yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() };
}
}
}
}
StatusTypeEnum.cs
public enum StatusTypeEnum()
{
[Description("Active")] // For correct naming
Active,
Inactive,
Processing
}
View.cshtml
@Html.DropDownListFor(x => Model.SelectedStatusId, Model.StatusItems)
EnumAttribute.cs(阅读注释描述。并且不要试图理解这一点。它只是魔术。它通过反射得到枚举类型的DataAnnotation。)
public static class EnumAttribute
{
public static string GetDescription<TEnum>(this TEnum value)
{
var fi = value.GetType().GetField(value.ToString());
if (fi != null)
{
var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
{
return attributes[0].Description;
}
}
return value.ToString();
}
}
问候,
S上。
答案 2 :(得分:1)
将它保存为数据库中的字符串没有多大意义,因为它听起来更像是静态的东西。所以你应该考虑一个Enum。对我来说,更精确地查看我之前的答案,并将这些Model属性添加到ViewModel。
public class CustomerViewModel () {
public int SelectedStatusId { get; set; }
[DisplayName("Status")]
public IEnumerable<SelectListItem> StatusItems
{
get
{
yield return new SelectListItem { Value = "", Text = "- Select a status -" };
StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum));
foreach (StatusTypeEnum item in values)
{
if (item != StatusTypeEnum.Unknown)
{
yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() };
}
}
}
}
}
通过您的控制器将其传递到您的视图中:
public class CustomerCOntroller(){
public ActionResult Index(){
CustomerViewModel viewModel = new CustomerViewModel();
return View(viewModel);
}
}
你完成了。如果您更多地使用需要构建的列表,请将其添加到viewModel对象中。
问候,
秒。
答案 3 :(得分:-1)
您可以在您的课程中将州声明为公共机构,并使用此权限在您的观看中访问它:
<ComboBox Grid.Column="1" Grid.Row="0" Margin="5"
VerticalAlignment="Center" ItemsSource="{Binding States}"
IsTabStop="False"}"/>