首页 > 解决方案 > 视图上显示不需要的代码

问题描述

我将一个简单的列表传递给 a Viewfrom a 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

谁能帮我删除它。提前致谢。

标签: c#asp.net-mvc

解决方案


@item是 type SelectListItem,并且它没有任何好的ToString重载。所以它继承了默认行为object,默认行为是返回完整的类型名称。这就是你得到的。

虽然生成 SelectListItem 然后不将其用于任何类型的选择有点奇怪,但解决当前问题的最简单方法是输出文本:

@item.Text

再次,确保你在做正确的事。SelectListItem如果你输出的只是它的文本,你真的需要一个吗?


推荐阅读