0

我的模型中有这段代码:

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(',')

提前致谢。

4

2 回答 2

0

问题(如我所见):

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

如果您想要一种简单的方法来做到这一点,您可能只需使用:

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”以找到“星期一”。在此说明中,为什么需要将其作为字符串获取(我将在下面对此进行推断)?

解决方案(如我所见):

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

如果您需要将星期几作为字符串工作,我真的认为不需要为星期几上课。由于您尝试选择与字符串相同的键和值,为什么不将字符串列表添加到您的 ViewBag/ViewModel,例如

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

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

public string WeekDay { get; set; }

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

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

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

于 2012-12-10T02:58:06.997 回答
0

ContactDayCheckBoxPost被定义为一个字符串。在将它传递给视图之前,你在这个字符串中放入了什么?

如果万一说你传递一个值

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

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

还要向我们展示您在视图中使用的内容,我发现很难理解您在这里的要求。

于 2012-12-09T16:48:43.993 回答