c# - C# Dropdown 为不同的项目返回不同的默认值
问题描述
我有一个呈现看起来像这样的编辑页面的获取页面
public ActionResult EditItemInstance(int id)
{
ItemInstance i = db.ItemInstances.Find(id);
var item = (from it in db.Items.Where(x => x.deleted == false)
select new
{
itemID = it.ID,
itemName = it.ItemID + ": " + it.Name
}).OrderBy(x => x.itemName).ToList();
ViewBag.ItemID = new SelectList(item, "itemID", "itemName", i.ItemID);
return View(i);
}
在我的视图页面中,我有一个看起来像这样的下拉列表
@Html.DropDownList("ItemID", null, "-- Select --", htmlAttributes: new { @class = "form-control chosen-select" })
我希望默认值是我正在编辑的当前项目的值。对于大多数项目,这可以正常工作。但是当我编辑一些项目时,我得到一个默认值'-- Select --'
为什么默认值对某些项目有效,但对其他项目却是“选择”?
解决方案
是的,如果您不需要,请不要使用ViewBag
和ViewData
传递数据。改为使用ViewModel
它,因为它是强类型的,您不必将其投射到您的视图上,并且您可以声明其他属性以满足您的需要。
同样,我不确定您ItemInstance
与从数据库返回的 s 列表之间的关系Item
,但是从您尝试执行的操作来看,我猜您的编辑页面一侧有一个下拉列表,并且无论当前正在编辑的项目实例将在下拉列表中选择?
public class EditItemInstanceViewModel
{
public IEnumerable<ItemOptionViewModel> AvailableItemOptions { get; set; }
public ItemInstanceViewModel ItemInstance { get; set; }
}
public class ItemOptionViewModel
{
public int ItemId { get; set; }
public string ItemName { get; set; }
}
public class ItemInstanceViewModel
{
public int ItemInstanceId { get; set; }
public string ItemInstanceName { get; set; }
// ... there might be more properties
}
然后在你的控制器中,你可以这样填写EditItemInstanceViewModel
:
public ActionResult EditItemInstance(int id)
{
ItemInstance itemInstance = db.ItemInstances.Find(id);
if (itemInstance == null)
{
return HttpNotFound();
}
var availableItemOptions = (from it in db.Items.Where(x => x.deleted == false)
select new ItemOptionViewModel
{
ItemID = it.ID,
ItemName = it.ItemID + ": " + it.Name
})
.OrderBy(x => x.ItemName)
.ToList();
var vm = new EditItemInstanceViewModel
{
AvailableItemOptions = availableItemOptions,
ItemInstance = new ItemInstanceViewModel
{
ItemInstanceId = itemInstance.Id,
ItemInstanceName = itemInstance.Name
}
};
return View(vm);
}
然后在视图上:
@model EditItemInstanceViewModel
@{
}
...
@Html.DropdownList("selected-item-id",
<!-- Enumerable items; Dropdown value field; Dropdown text field; Selected value; -->
new SelectList(Model.AvailableItemOptions, "ItemInstanceId", "ItemInstanceName", Model.ItemInstance.ItemInstanceId),
"-- Select --",
new { @class = "form-control chosen-select" })
...
又好又干净!
推荐阅读
- c++ - macos GCC 工具链编译简单的 hello world 的问题
- r - 为什么标签()返回给“级别=”的内容,反之亦然?
- java - while循环不遵守退出条件
- javascript - 如何消除与 lodash 反应的事件处理程序?
- javascript - 关于如何使用 switch 语句根据教育水平显示工资的代码,我可以做些什么来更正我的代码?
- xamarin - 如何在 Android 上使用 Xamarin 的 ScrollView
- php - 如何循环数组并显示唯一键 X 和连接值 Y
- javascript - Chrome 网络扩展程序中的权限不同步
- python - Python:TypeError:'str'和'int'的实例之间不支持'<'
- ios - 为什么我的图标在 ios13 中有不同的行为