Для всех нескольких выпадающих списков требуется нулевое значение, если значение не изменилось… Также необходимо, чтобы выбранное значение было по умолчанию

#asp.net-mvc #vb.net #asp.net-mvc-3 #razor

#asp.net-mvc #vb.net #asp.net-mvc-3 #razor

Вопрос:

MVC 3 VB.NET бритва. У меня есть представление, в котором есть 4 выпадающих списка.. Это для настройки сотрудника.. Если этот сотрудник должен работать с определенными классами, то этот класс будет установлен для каждого дня. Если это не так, значение должно оставаться нулевым. Это вид редактирования, поэтому к нему, возможно, придется обращаться несколько раз и при этом сохранять исходные значения списка выбора, если ничего не изменилось. Ниже приведено то, что у меня есть прямо сейчас, которое работает только на лицевой стороне. Сначала отображается старое выбранное значение. Однако это не возвращается при сохранении… Единственный способ сохранить его правильно — это выбрать значение, которое было установлено в каждом поле, а затем нажать Сохранить. Следующая проблема заключается в том, что не у всех сотрудников будут занятия для работы каждый из 4 дней. Итак, как мне установить значение null и сохранить его таким, если класс фактически не выбран..

     Dim _staff As confstaff = db.confstaffs.Single(Function(a) a.id = id)
        ViewBag.role = _staff.Conf_Role.ToString
        ViewBag.confRole = db.conf_roles.ToList
        ViewData("tue_Class") = New SelectList(db.courses.ToList.Where(Function(r) r.course_day = "Tuesday").Select(Function(r) r.course_ref), New With {.value = _staff.tue_class})
        ViewData("wed_Class") = New SelectList(db.courses.ToList.Where(Function(r) r.course_day = "Wednesday").Select(Function(r) r.course_ref), New With {.value = _staff.wed_class})
        ViewData("thur_Class") = New SelectList(db.courses.ToList.Where(Function(r) r.course_day = "Thursday").Select(Function(r) r.course_ref), New With {.value = _staff.thur_class})
        ViewData("fri_Class") = New SelectList(db.courses.ToList.Where(Function(r) r.course_day = "Friday").Select(Function(r) r.course_ref), New With {.value = _staff.fri_class})
        Return View(_staff)
  

И представление:

      <label>Tuesday Class</label>
       @Html.DropDownList("tue_class", "Select One")
     <label class="small_spacing">Wednesday Class</label>
        @Html.DropDownList("wed_class", "Select One")
     <label class="small_spacing">Thursday Class</label>
        @Html.DropDownList("thur_class", "Select One")
     <label class="small_spacing">Friday Class</label>
        @Html.DropDownList("fri_class", "Select One")
  

Я уже ожидаю, что кто-нибудь укажет, что я должен использовать модель представления вместо viewbag, но я не вижу, как модель представления будет практичной, если существует более 100 различных курсов, но я открыт для идей…

Есть идеи???????

Ответ №1:

если вы посмотрите на источник своей страницы после загрузки страницы, вы увидите, что ваш верхний элемент, установленный в вашем viewbag, не имеет значения, только текст, поэтому, когда он отправлен, он думает, что вы отправляете пустой. Я сталкивался с этим раньше.

Что вам нужно сделать, это вручную создать каждый из ваших выпадающих списков, выполнив итерацию по коллекции и установив тот, который соответствует вашему элементу viewbag, выбранным, таким образом, вы можете быть уверены, что выбранный элемент имеет выбранное значение. У меня где-то здесь есть код Razr. Будет обновляться, когда я его найду.

Редактировать

     <select name="Type1" id="Type1">

    <option value=""></option>
     @foreach (var name in ViewBag.BackOfficeTypes)
     {
         if (name == ViewBag.SelectedType1Value)
         {
             <option value="@name" selected="selected">@name</option>
         }
         else
         {
                 <option value="@name">@name</option> 
         }
     }
     </select> 
  

У меня есть несколько из них на одной странице, построенной из разных наборов элементов. Надеюсь, это поможет.

РЕДАКТИРОВАТЬ 2

Если вы хотите сделать все это из codebehind, я не специалист по VB, но вот способ сделать это, но вам нужно изменить свой оператор linq, чтобы вручную создавать элементы списка вместо сброса из метода ToList.

 var courses = db.getCourses();
   IEnumerable<SelectListItem> selectList = 
    from c in courses
    where c.course_day = "Tuesday"
    select new SelectListItem
    {
        Selected = (c.CourseID == selectedCourseID),
        Text = c.Name,
        Value = c.CourseID.ToString()
    };
  

Если вы можете перевести это в эквивалент VB, это может решить вашу проблему вместо того, чтобы создавать их в конце Razor.

Комментарии:

1. Хммм, возможно, здесь это не так… Посмотрите вверху на мое редактирование, вы увидите источник страницы просмотра…

2. Это так. Посмотрите на первый вариант в вашем выборе. Значение установлено в «». <значение параметра=»»>T3</option>. Ниже оно снова появляется с правильным значением

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

4. Я снова отредактировал, чтобы показать метод запроса Linq для создания ваших списков выбора, но я не специалист по VB, поэтому я не могу комментировать другой опубликованный вами код. Я просто знаю, как решить проблему в Razor и C #. Я предполагаю, что Linq для VB имеет аналогичный синтаксис, поэтому вы должны быть в состоянии это сделать.