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端构建它们。