多个下拉框都需要空值,如果值没有改变.还需要选择值为默认值



MVC 3vb。净剃须刀。我有一个视图,其中有4个下拉框。这是用来设置工作人员的。如果该工作人员要上某些课程,那么该课程将每天设置。如果不是,则该值需要保持为空。这是一个编辑视图,因此可能需要多次访问它,如果没有更改,则仍然保持原始的selectlist值。下面是我现在只在它的表面上工作的东西。首先显示的是Old选定值。然而,这不会在保存时返回…它将正确保存的唯一方法是如果我选择在每个框中设置的值,然后单击保存。下一个问题是,并不是所有的员工都会在这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")

我已经期望有人指出我应该使用视图模型而不是视图包,但我不知道视图模型如何实用,因为有100多个不同的课程,但我对想法持开放态度…

有什么想法?

如果你在页面加载后查看你的页面源,你会看到你的顶部项目集从你的viewbag值没有值只有文本,所以当它被提交时,它认为你提交空白。我以前遇到过这个。

你需要做的是手动创建你的每个下拉列表,通过迭代的集合,并设置一个匹配你的viewbag项目被选中,这样你可以确保一个被选中的项目有一个被选中的值。我这附近有一些剃刀的代码。当我找到它时会更新。

编辑

    <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

如果你想从代码后面完成这一切,我不是一个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端构建它们。

最新更新