我正在从View
向Controller
传递一个简单列表。
控制器代码:
public ActionResult GetRoles(string UserName)
{
if (!string.IsNullOrWhiteSpace(UserName))
{
IdentityUser user = db.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));
ViewBag.RolesForThisUser = manager.GetRoles(user.Id);
// prepopulat roles for the view dropdown
var list = db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
}
return View("ManageUserRoles");
}
和View
代码是:
@using (Html.BeginForm("GetRoles", "Roles"))
{
@Html.AntiForgeryToken()
<p>
Username : @Html.TextBox("UserName")
<input type="submit" value="Get Roles for this User" />
</p>
if (ViewBag.Roles != null)
{
<p>
@foreach (var item in ViewBag.Roles)
{
@item;
}
</p>
}
}
一切都按计划运行,但是在浏览器中,我看到了这个不需要的代码:
System.Web.Mvc.SelectListItemSystem.Web.Mvc.SelectListItem
任何人都可以帮助我删除它。提前致谢。
答案 0 :(得分:3)
@item
的类型为SelectListItem
,并且没有很好的ToString
重载。因此,它继承了object
的默认行为,并且默认行为是返回完整的类型名称。那就是你得到的。
虽然生成SelectListItem然后不将其用于任何选择有点奇怪,但是解决当前问题的最简单方法是输出文本:
@item.Text
同样,请确保您在做正确的事。如果您只输出SelectListItem
的文字,您真的需要吗?
答案 1 :(得分:1)
对我来说还不太清楚,因为您使用了大量的var而不是普通类型,但这是这样的:
<p>
@foreach (var item in ViewBag.Roles)
{
<span>@item.Text</span>
}
</p>
答案 2 :(得分:0)
使用SelectListItem
在DropDownList
/ DropDownListFor
绑定之外的视图中显示是毫无意义的。您只需将Roles
列表直接存储到ViewBag
即可:
ViewBag.Roles = db.Roles.OrderBy(r => r.Name).ToList();
然后在视图内部通过foreach
循环传递name属性:
if (ViewBag.Roles != null)
{
<p>
@foreach (var item in ViewBag.Roles)
{
@item.Name
}
</p>
}
如果您真的想将其绑定到DropDownList
/ DropDownListFor
中,则可以使用以下内容:
@Html.DropDownList("Name", ViewBag.Roles as List<SelectListItem>, ...)
@Html.DropDownListFor(model => model.Name, ViewBag.Roles as List<SelectListItem>, ...)