字典< short,字典< EnFunction,bool>>模型绑定不起作用 [英] Dictionary<short, Dictionary<EnFunction, bool>> model binding not work

查看:54
本文介绍了字典< short,字典< EnFunction,bool>>模型绑定不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法将模型绑定到Controller.请给我任何建议. 模型,控制器和视图类如下.提交模型后,字典属性等于null.

I could not bind the model to Controller. Please give me any advice. Model,controller and view classes are below. When model is submmited, dictionary property equals to null.

public class GroupRights //model
{
    public List<DtoGrup> groups { get; set; }
    public Dictionary<short, Dictionary<EnFunction, bool>> groupRights { get; set; } // group function HasPermission
}

public enum EnFunction   
{
    LPDU_login,
    LPDU_changePassword,
    LPDU_transitList,
    LPDU_PosEventList,
    ....
}

控制器

public ActionResult GroupRights()
{
    TocCommonService.CommonServiceClient client = new TocCommonService.CommonServiceClient();
    GroupRights gr = new GroupRights();
    gr.groups = client.GetAllOperatorGroups().ToList();
    gr.groupRights = new Dictionary<short, Dictionary<EnFunction, bool>>();
    foreach (var g in gr.groups)
    {
        Dictionary<EnFunction, bool> permission = new Dictionary<EnFunction, bool>();
        foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast<EnFunction>())
        {
            permission.Add(func, client.hasPermission(new DtoGrup() { GROUPID = g.GROUPID }, func));                  
        }
        gr.groupRights.Add(g.GROUPID, permission);
    }
    return View(gr);
}

查看

@model TocWebApplication.Models.GroupRights
@{
    int id = 0;
}
@using (Html.BeginForm("ChangePermissionOfGroup", "Home", FormMethod.Post))
{
    <table>
        <thead>
            <tr>
                <th></th>
                @foreach (var gr in Model.groups)
                {
                    <th>@gr.GROUPNAME (@gr.GROUPID)</th>
                }
            </tr>
        </thead>
        <tbody>
            @foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast<EnFunction>())
            {
                <tr>
                    <td>@(func.ToString())</td>
                    @for (int j = 0; j < Model.groups.Count(); j++)
                    {
                        <td>@Html.CheckBoxFor(model => model.groupRights[Model.groups[j].GROUPID][func])</td>
                    }
                </tr>
            }
        </tbody>
    </table>

    <button type="submit" class="btn btn-primary">Save changes</button>
    <button class="btn">Cancel</button>
}

推荐答案

对于除Dictionary以外的所有其他内容,其中KeyValue均为简单值类型(例如Dictionary<string, bool>),DefaultModelBinder要求名称/value属性采用的格式(根据您的情况)

For all but Dictionaries where both the Key and Value are simple value types (for example Dictionary<string, bool>), the DefaultModelBinder requires the name/value attributes to be in the format (in your case)

<input name="groupRights[0].Key" value="1" ... />
<input name="groupRights[0].Value[0].Key" value="LPDU_login" ... />
<input name="groupRights[0].Value[0].Value" value="True" ... />
<input name="groupRights[1].Key" value="2" ... />
<input name="groupRights[1].Value[0].Key" value="LPDU_changePassword" ... />
<input name="groupRights[1].Value[0].Value" value="False" ... />

没有HtmlHelper方法可以生成正确的属性并绑定到groupRights,您需要手动生成html.

There are no HtmlHelper methods that can generate the correct attributes and to bind to your groupRights you would need to generate the html manually.

相反,创建一个表示要在视图中显示的数据的视图模型.如果我正确地解释了这一点,则要显示一个表格,向下显示每个EnFunction值和每个DtoGrup并在每个单元格中显示一个复选框,以确定为每个DtoGrup选择哪个EnFunction.

Instead, create a view model(s) that represents the data you want to display in the view.If I have interpreted this correctly, you want to display a table displaying each EnFunction value down, and each DtoGrup across, and to display a checkbox in each cell to determine which EnFunction is selected for each DtoGrup.

public class GroupRightsVM // represents a table cell
{
    public short GroupID { get; set; }
    public bool IsSelected { get; set; }
}
public class RightsVM // represents a table row
{
    public RightsVM()
    {
        Groups = new List<GroupRightsVM>()
    }
    public EnFunction Right { get; set; }
    public List<GroupRightsVM> Groups { get; set; } // represents the cells in a row
}
public class PermissionsVM // Represents the table
{
    public PermissionsVM()
    {
        Permissions = new List<RightsVM>()
    }
    public IEnumerable<string> Headings { get; set; } // represents the table headings
    public List<RightsVM> Permissions { get; set; } // represents all rows
}

在视图中

<thead>
    <tr>
        <th></th>
        @foreach(var heading in Model.Headings)
        {
            <th>@heading</th>
        }
    </tr>
</thead>
<tbody>
    @for(int i = 0; i < Model.Rows.Count; i++)
    {
        <tr>
            <td>
                @Html.HiddenFor(m => m.Permissions[i].Right)
                @Html.DisplayFor(m => m.Permissions[i].Right)
            </td>
            @for(int j = 0; j < Model.Permissions[i].Groups.Count; j++)
            {
                <td>
                    @Html.HiddenFor(m => m.Permissions[i].Groups[j].GroupID)
                    @Html.CheckboxFor(m => m.Permissions[i].Groups[j].IsSelected)
                </td>
            }
        </tr>
    }
</tbody>

在GET方法中,初始化PermissionsVM的实例,并根据您的数据模型填充它,并将其传递给视图,例如

In the GET method, initialize an instance of PermissionsVM and populate it based on your data models and pass it to the view, for example

var groups = client.GetAllOperatorGroups()
var model = new PermissionsVM();
model.Headings = groups.Select(x => String.Format("{0} {{1})", x.GROUPNAME, x.GROUPID));
foreach (var func in Enum.GetValues(typeof(EnFunction)).Cast<EnFunction>())
{
    RightsVM r = new RightsVM();
    r.Right = func;
    foreach (var g in groups)
    {
        GroupRightsVM gr = new GroupRightsVM();
        gr.GroupID = g.GROUPID;
        gr.IsSelected = ...
        r.Groups.Add(gr);
    }
    model.Persmissions.Add(r);
}
return View(model);

以及POST方法中

public ActionResult GroupRights(PermissionsVM model)

这篇关于字典&lt; short,字典&lt; EnFunction,bool&gt;&gt;模型绑定不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆