2016-12-15 2 views
0

В настоящее время я работаю над приложением, которое разрабатывается с использованием C# и Asp.Net MVC.Метод расширения не работает как следует

На одном из видов у меня есть около 10 DropDowns, которые должны выбрать пользователи. Выбранное значение сохраняется в базе данных.

Для примера:

  1. DropDown имеет Value из 1 и Text появляется как First Main Fault
  2. DropDown имеет Value из One и появляется Text в First Sub Fault

Теперь пользователи могут вернуться и изменить их записей. Поэтому я хочу показать им DropDown, который уже выбран со значением того, что хранится в базе данных.

Для этого я использую следующий метод расширения

public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> items, Func<T, string> textSelector, Func<T, string> valueSelector, Func<T, bool> selecter) 
{ 
    return items.OrderBy(item => textSelector(item)) 
     .Select(item => 
     new SelectListItem 
     { 
      Selected = selecter(item), 
      Text = textSelector(item), 
      Value = valueSelector(item) 
     }); 
} 

Что я называю, как

var mainFaultSelectedDdl = mainFaults.ToSelectListItems(
      m => m.MainFaultDescription, 
      m => m.Id.ToString(), 
      m => m.Id == mainFaultId); //mainFaultId here equals to 1. I've also tried m.Id.ToString() == mainFaultId.ToString() but still the same issue 

var subFaultSelectedDdl = subFaults.ToSelectListItems(
      s => s.SubFaultDescription, 
      s => s.SubFaultDescription, 
      s => s.SubFaultDescription == erst.SubFault); //erst.SubFault here equals to One 

Когда я отлаживать код, который я могу видеть, как из выше DropDownsSelected установлен в True но в представлении MainFault DropDown не выбрано, но выбран SubFault DropDown.

Может кто-нибудь сказать мне, где я ошибаюсь, пожалуйста.

Это, как я в настоящее время генерации DropDown в представлении

@Html.DropDownListFor(m => m.Serial.MainFault, Model.MainFaultDdl, "Please select a main fault", new { id = "mainFaults", @class = "form-control main-ddl" }) 
@Html.DropDownListFor(m => m.Serial.SubFault, Model.SubFaultDdl, "Please select a sub fault", new { id = "subFaults", @class = "form-control main-ddl" }) 
+0

Как вы создаете свои dropdownlists в представлении. Установка свойства 'Selected'' SelectListItem' игнорируется при привязке к модели –

+0

, где вы задаете значение для 'mainFaultId' и' erst.SubFault'? – HimBromBeere

+0

@StephenMuecke Я обновил свой вопрос, чтобы включить код из представления. Он работает для одного, а не для другого, это то, что меня путает – Code

ответ

1

Модель связывания работ путем связывания с стоимости вашего имущества, в вашем случае значение Serial.MainFault. Если значение Serial.MainFault соответствует одному из значений параметра (заданному значением свойства Id объектов в mainFaults), то он будет выбран. Если он не соответствует значению, тогда будет выбран первый вариант, потому что что-то должно быть.

Установка Selected свойства SelectListItem игнорируется при использовании метода DropDownListFor(), потому что внутренне метод строит свои собственный IEnumerable<SelectListItem> и устанавливает Selected свойства на основании стоимости имущества вашего связывания (обратите внимание, что исключение из этого - в случае использования DropDownListFor() в петле, как описано в this answer).

Однако ваши методы расширения не кажутся необходимыми, поскольку MVC уже имеет способ построения IEnumerable<SelectListItem> с использованием одного из конструкторов SelectList.

На основе кода вы показали, что ваш метод GET может быть просто

var model = new YourModel(); 
model.Serial.MainFault = mainFaultId; // set the value to be displayed initially 
model.MainFaultDdl = new SelectList(mainFaults, "Id", "MainFaultDescription"); // generate the options 
return View(model); 

или в качестве альтернативы вы можете использовать следующие для генерации вариантов

model.MainFaultDdl = mainFaults.Select(x => new SelectListItem() 
{ 
    Value = x.Id.ToString(), 
    Text = x.MainFaultDescription 
}; 

и будет отображаться правильный вариант в представлении.

+0

Спасибо за это. – Code

Смежные вопросы