首页 > 解决方案 > 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 --'

为什么默认值对某些项目有效,但对其他项目却是“选择”?

标签: c#htmlrazor

解决方案


是的,如果您不需要,请不要使用ViewBagViewData传递数据。改为使用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" })

...

在此处输入图像描述


又好又干净!


推荐阅读