1

我正在尝试MultiSelectList在我的视图中创建一个,但是在 PartialView 的这一行上抛出了一个异常:

@Html.ListBoxFor(x => x.RegisterModel.SelectedRoles, Model.RegisterModel.Roles)

没有具有键“RegisterModel.SelectedRoles”的“IEnumerable”类型的 ViewData 项。

我希望MultiSelectList成为所有角色的列表,但我不太确定我做错了什么。我最初制作RegisterModel.SelectedRoles了一个string[],因为当将用户添加到角色时,astring[]应该作为System.Web.Security.Roles.AddUserToRoles().

模型

public class DynamicActionUserModel {
    public string Action { get; set; }
    public RegisterModel RegisterModel { get; set; }
}

public class RegisterModel {
    public string[] SelectedRoles { get; set; }
    public MultiSelectList Roles { get; set; }
}

控制器

[HttpGet]
public ActionResult CreateUser() {
    DynamicActionUserModel model = new DynamicActionUserModel {
        Action = "CreateUser",
        RegisterModel = new RegisterModel {
            Roles = new MultiSelectList(System.Web.Security.Roles.GetAllRoles().OrderBy(r => r))
        }
    };

    return PartialView("_UserPartial", model);
}

看法

<div>
    @Html.Partial("_UserPartial", new DynamicActionUserModel{ Action = "CreateUser", RegisterModel = new RegisterModel()})
</div>

部分视图

@Html.LabelFor(x => x.RegisterModel.Roles)
@Html.ListBoxFor(x => x.RegisterModel.SelectedRoles, Model.RegisterModel.Roles)
4

1 回答 1

2

在这一行上,您正在渲染_UserPartial部分,但您传递给此视图的模型是空的,您只是实例化了它,但里面没有角色:

@Html.Partial("_UserPartial", new DynamicActionUserModel{ Action = "CreateUser", RegisterModel = new RegisterModel()})

永远不会调用该CreateUser操作来填充 Roles 属性。

您可能希望将其作为子操作调用:

<div>
    @Html.Action("CreateUser")
</div>

现在 CreateUser 操作将作为子操作调用,它将填充模型的 Roles 属性并将其传递给部分。这个部分的执行结果将被注入到包含的<div>.

请查看以下文章Html.Partial以更好地了解和之间的区别Html.Action

于 2012-10-09T06:02:08.023 回答