我的模型中有一些代码:
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(); }
}
我使用ContactDayCheckBox
将int?
值存储在数据库中。我使用ContactDayCheckBoxPost
在确认视图中显示所选项目(复选框)。
如果我在我的视图中@Html.EditorFor(m => m.ContactDayCheckBoxPost)
,并且用户之前选择了超过一天(例如),则它仅显示一天的“名称”(即,如果之前,周二之前选择了它,则仅在视图中显示“星期一”。
如何让视图显示之前选择的所有选项?我尝试了@foreach
,但它无法与int
一起使用,我尝试使用.Split(',')
的各种循环来在选项之间插入逗号,但我得到的只是实际的“ID “值(例如,”1“表示”星期一“,而不是”星期一“)。
提前致谢。
答案 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可以用于调试目的。