2013-06-05 51 views
1

我想將數據從控制器傳遞到查看。在我的晚餐控制中,我有一個編輯操作。代碼是ViewData錯誤 - 使用ViewData將數據從控制器傳遞到查看

// 
// GET: /Dinner/Edit/5 

public ActionResult Edit(int id) 
{ 
    var dinner = _repository.GetDinner(id); 
    ViewData["Countries"] = new SelectList(PhoneValidator.AllCountries, dinner.Country); 
    return View(dinner); 
} 

然後,我想使用下拉列表在編輯視圖頁面中顯示國家的信息。我的代碼是

<div class="editor-label"> 
    @Html.EditorFor(model => model.Country) 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("Country", ViewData["Countries"] as SelectList) 
    @Html.ValidationMessageFor(model => model.Country) 
</div> 

然後,我在這條線得到一個錯誤

@Html.DropDownList("Country", ViewData["Countries"] as SelectList) 

錯誤信息是

The ViewData item that has the key 'Country' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>' 

注:

  • 我有一個「國家「的財產在我的餐桌上。國家類型是字符串。
  • 我認爲錯誤行中的「國家」只是定義了顯示名稱 該字段的形式。所以錯誤似乎inresonabel。
  • 我有一個類名DinnerViolation,我這個班,我有一種渴望 方法以檢索,我在我的編輯控制器,用於設置的SelectList的價值allcontries,請檢查代碼:

    public class PhoneValidator 
        { 
         static IDictionary<string, Regex> countryRegex = new Dictionary<string, Regex>() {   
         { "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")},    
         { "UK", new Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")},    
         { "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")},  
         }; 
         public static bool IsValidNumber(string phoneNumber, string country) 
         { 
          if (country != null && countryRegex.ContainsKey(country)) 
           return countryRegex[country].IsMatch(phoneNumber); 
          else 
           return false; 
         } 
         public static IEnumerable<string> AllCountries 
         { 
          get 
          { 
           return countryRegex.Keys; 
          } 
         } 
    
        } 
    

    }

任何幫助?謝謝

+2

開始使用視圖模型,並退出與'ViewData'和'ViewBag'亂搞。 – gdoron

回答

0

您正在返回一個IEnumerable<string>

public static IEnumerable<string> AllCountries 
{ 
    get 
    { 
     return countryRegex.Keys; 
    } 
} 

當你需要返回IEnumerable<SelectListItem>

像這樣(未測試):

public static IEnumerable<SelectListItem> AllCountries 
{ 
    get 
    { 
     var countries = new List<SelectListItem>(); 
     foreach(var country in countryRegex.Keys) 
     { 
      countries.Add(SelectListItem() { Text = country, Value = country }; 
     } 
     return countries; 
    } 
} 
+0

感謝您的所有答案。最後,我使用ViewModel作爲gdoron建議。我的問題解決了。 Tom Studee,我選擇了你的答案,因爲我認爲你對我的代碼付出了努力。謝謝。 – Lucky

相關問題