2012-12-09 91 views
0

int`項目我在我的模型這段代碼:如何顯示'在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(); } 
} 

我用ContactDayCheckBox存儲在數據庫中的int?值。我使用ContactDayCheckBoxPost在確認視圖中顯示所選項目(複選框)。

如果我在我看來做了@Html.EditorFor(m => m.ContactDayCheckBoxPost),並且用戶先前選擇了超過一天(例如),它只顯示一天的「名稱」(即,如果星期一,星期二先前選擇,它只顯示「星期一「在視圖中)。

我該如何去獲得先前選擇顯示所有選項的看法?我試圖@foreach,但它不會與int工作,我嘗試了,涉及.Split(',')插入選項之間用逗號循環的變化,但我得到的是實際的「ID」值(例如,「1」的「星期一」 ,而不是「星期一」)。

在此先感謝。

回答

0

ContactDayCheckBoxPost被定義爲一個字符串。在將它傳遞給視圖之前,你將這個字符串放進了什麼?

如果萬一說你傳遞一個值

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

那麼在這種情況下,你可以將Split(',')函數獲得這些ID作爲字符串,那麼你可以使用的foreach來獲取列表IDS。

還向我們展示你正在使用你的觀點是什麼,我發現它有點難以明白你問這裏。

+0

'@ EditorFor'是我的視圖(和@using MyModel','@model MyModelView')。我正在用'ContactDayCheckBoxPost'嘗試不同的事情。如果我將其設置爲「int」,則只顯示「ID」(即,如果從複選框列表中選擇星期一,星期二,則它僅顯示「1」(而不是「1,2」))。我不知道如何使用'@ foreach'來獲得「ID」(這是我的問題的答案)。你能提供一個例子嗎? – REMESQ

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).aspxSelectListItem的定義。

如果你想要一個簡單的方法來做到這一點,你很可能只是用:

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();)。有關使用DropDownList的枚舉的示例,請參見http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx

如果你需要將星期幾作爲一個字符串工作,我並不認爲有必要在一週中有一個班級。由於您試圖選擇與字符串相同的鍵和值,因此爲什麼不將字符串列表添加到ViewBag/ViewModel,例如

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

有一個名爲「星期」,在你的模型或視圖模型屬性:

public string WeekDay { get; set; } 

然後,你可以使用它來設置一個字符串屬性,像這樣:

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

注意:您應該爲這種方法真正地定義一個編輯ViewModel,但ViewBag對於調試目的會很好。