如何在Razor视图中显示`int`项

时间:2012-12-09 16:35:26

标签: asp.net-mvc-3 razor

我的模型中有一些代码:

public class ContactDaySelectorAttribute : SelectorAttribute
{
    public override IEnumerable<SelectListItem> GetItems()
    {
        var contactDay = new List<ContactDay> 
        { 
            new ContactDay {Id = 1, Name = "Monday"},
            new ContactDay {Id = 2, Name = "Tuesday"},
            new ContactDay {Id = 3, Name = "Wednesday"},
            new ContactDay {Id = 4, Name = "Thursday"},
            new ContactDay {Id = 5, Name = "Friday"},
            new ContactDay {Id = 6, Name = "Saturday"},
        };
        return contactDay.ToSelectList(m => m.Id, m => m.Name);
    }
}
//
public class ContactDay
{
    public int Id { get; set; }
    public string Name { get; set; }
}
//
[ContactDaySelector]
public virtual int? ContactDayCheckBox { get; set; }
//
[ContactDaySelector]
[ReadOnly(true)]
public string ContactDayCheckBoxPost
{
    get { return ContactDayCheckBox.ToString(); }
}

我使用ContactDayCheckBoxint?值存储在数据库中。我使用ContactDayCheckBoxPost在确认视图中显示所选项目(复选框)。

如果我在我的视图中@Html.EditorFor(m => m.ContactDayCheckBoxPost),并且用户之前选择了超过一天(例如),则它仅显示一天的“名称”(即,如果之前,周二之前选择了它,则仅在视图中显示“星期一”。

如何让视图显示之前选择的所有选项?我尝试了@foreach,但它无法与int一起使用,我尝试使用.Split(',')的各种循环来在选项之间插入逗号,但我得到的只是实际的“ID “值(例如,”1“表示”星期一“,而不是”星期一“)。

提前致谢。

2 个答案:

答案 0 :(得分:0)

ContactDayCheckBoxPost被定义为字符串。在将此字符串传递给视图之前,您在该字符串中放置了什么?

如果有人说你传递的值为

ContactDayCheckBoxPost = "1, 2, 3, 4";

然后在这种情况下,您可以应用Split(',')函数并将这些ID列表作为字符串,然后您可以使用foreach来获取ID。

同时向我们展示您在视图中使用的内容,我发现您在此处理解的内容有点难以理解。

答案 1 :(得分:0)

问题(我认为):

我认为你遇到的问题是SelectList是一个'键/值'对,但是你想要用'key'作为'value'。因此,对于值为'1'的关键'Monday',1将是我期望的值。有关示例,请参见http://codeclimber.net.nz/archive/2009/08/10/how-to-create-a-dropdownlist-with-asp.net-mvc.aspx;有关SelectListItem的定义,请参见http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlistitem(v=vs.108).aspx

如果您想要一种简单的方法,可以使用:

return contactDay.ToSelectList(m => m.Name, m => m.Name); //Both the key and the value are Name

但这会失败,因为你的ContactDaySelector期望一个可以为空的int:

[ContactDaySelector]
public virtual int? ContactDayCheckBox { get; set; }

这有意义吗?

如果您想使用此方法,请使用您的类并在[HttpPost]操作中对值“1”执行查找以查找“Monday”。在这个注释中,为什么你需要将它作为一个字符串(我将在下面进行推断)?

解决方案(我认为):

更好的解决方案可能是为一周中的某几天制作一个枚举(实际上,在枚举帮助页面上给出了一周中的几天 - http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx它甚至是内置的枚举{{3 }})。然后在整个应用程序中使用它(例如,在控制器的[HttpPost]操作上)将其设置为数值(例如(int)Days.Sun),但能够检索其关键字值(例如Days.Sun.ToString();) 。有关为DropDownList使用枚举的示例,请参阅http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx

如果您需要将一周中的某些日子作为字符串使用,我实际上并不需要为一周中的某些日子安排课程。由于您尝试选择与字符串相同的键和值,为什么不向ViewBag / ViewModel添加字符串列表,例如

List<String> daysOfTheWeek = new List<String>() { "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun" };
ViewBag.DaysOfTheWeek = daysOfTheWeek;

在您的模型或ViewModel中有一个名为“WeekDay”的属性:

public string WeekDay { get; set; }

然后您可以使用它来设置字符串属性,如下所示:

@Html.DropDownListFor(model => model.WeekDay, new SelectList(ViewBag.DaysOfTheWeek))

注意:您应该为此方法定义一个编辑ViewModel,但ViewBag可以用于调试目的。