我从来没有在stackoverflow上问过一个问题,也从未想过,但我很绝望,所以我们走了:我无法获得一个保存的值,以显示为下拉列表中的默认值/显示。
我在控制器中设置了列表:
public ActionResult Index()
{
//User Dropdown List
var users = Roles.GetUsersInRole("Manager");
SelectList list = new SelectList(users);
ViewBag.Users = list;
return View();
}
然后在视图中,管理员可以选择其中一个用户并通过EF将其保存到我的数据库:
@ Html.DropDownList(“Users”,ViewBag.Users as SelectList,“--Select Manager - ”)
这一切都很好,但是当您编辑此条目时,我希望下拉列表显示当前保存的管理器,而不是列表中的第一个名称。我希望我的编辑操作可以将当前经理从数据库中拉出来并将其作为默认选定项目传回下拉列表,但不要执行:
public ActionResult Edit(int id = 0)
{
var theOwner = (from v in _db.Location where v.LocationID == id select v.Owner).FirstOrDefault();
var users = Roles.GetUsersInRole("Manager");
SelectList list = new SelectList(users, theOwner);
ViewBag.Users = list;
在我过去两周阅读的所有示例中,每个人都有3个不同的值来处理它们的下拉菜单,从而可以使用SelectList方法中的所有重载。但是,我的问题是我只有这个字符串列表中只有一个项目,所以我不能像我想的那样利用过载。
那么有没有人知道如何让它工作?非常感谢你的时间!
答案 0 :(得分:1)
我非常确定如果您在创建SelectList的行上修改第二个参数,它应该可以工作 - 它适用于我。
以下是我认为麻烦的问题:目前您将第二个参数指定为' theOwner',它是早期Linq语句的对象引用。但是SelectList包含一串字符串(与指定角色名匹配的用户的UserNames)。结果,SelectList不知道'如何将您指定为SelectedItem的内容与其包含的字符串列表中的内容进行匹配。
但是如果你改进第二个参数,那么它指定你刚刚查找的所有者的USERNAME,它应该可以工作。但是,我不知道您的位置表中的正确属性名称是什么。如果您当前选择的字段(v.Owner
)包含UserName本身而不是某些Key,则语法将为:
SelectList list = new SelectList(users, theOwner.Owner);
如果该列实际上包含用户的密钥(如int或Guid),那么您将使用密钥查询UserName,但修复的性质是相同的。
希望有所帮助。
答案 1 :(得分:0)
快速解决方法不是使用@ Html.DropDownList而是使用纯HTML代码。
作为您的案例,请在View中使用以下html代码而不是Html.DropDownList帮助程序:
<!-- NOTE: the ID and name attributes of "select" tag should be the same as
the name of the corresponding property in your Model in order for ASP.NET MVC
to edit your Model correctly! -->
<select id="User" name="User">
@foreach (var user in (SelectList)ViewBag.Users)
{
if (user == ViewBag.TheOwner)
{
<option value="@user" text="@user" selected = "selected" />
}
else
{
<option value="@user" text="@user" />
}
}
</select>
此外,为此,您需要在Edit
方法中再添加一行:
ViewBag.TheOwner = theOwner;
使用@Html.DropDownListFor()
也可以使用另一种解决方案,但是你没有展示你的模型,所以我无法告诉你究竟要使用什么。使用DropDownListFor
时,ASP.NET MVC将根据模型中的值自动选择一个选项。