2013-06-05 4 views
1

Я хочу передать данные с контроллера для просмотра. В моем управлении ужином у меня есть действие «Изменить». КодViewData Error-Using 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, я этот класс, у меня есть получить метод retrive allcontries, который я использовал в моем редактировании контроллера, чтобы установить значение SelectList, пожалуйста, проверьте код:

    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

начать использовать ViewModel и бросить возиться с '' 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