Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将复杂模型的列表中的问题绑定到mvc应用程序_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 将复杂模型的列表中的问题绑定到mvc应用程序

C# 将复杂模型的列表中的问题绑定到mvc应用程序,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我是使用.NETMVCWeb应用程序的新手。我正在使用Web应用程序的版本4。 我正在开发一个页面来管理简单成员资格提供者的角色,我希望它是动态的。为了弄清楚我的意思,应该是这样的: <input id="AllRoleNames__0_" name="AllRoleNames.[0]" type="hidden" value="Admin"> Admin <input id="AllRoleNames__1_" name="AllRoleNames.[1]" type="hi

我是使用.NETMVCWeb应用程序的新手。我正在使用Web应用程序的版本4。 我正在开发一个页面来管理简单成员资格提供者的角色,我希望它是动态的。为了弄清楚我的意思,应该是这样的:

<input id="AllRoleNames__0_" name="AllRoleNames.[0]" type="hidden" value="Admin">
Admin
<input id="AllRoleNames__1_" name="AllRoleNames.[1]" type="hidden" value="Extrator">
Extrator

就这么简单。为此,我有一个复杂的ViewModel,如下所示:

public class UserInRolesModel
{
    public List<string> AllRoleNames { get; set; }
    public List<UserInRoles> UsersInRoles { get; set; }

    public UserInRolesModel()
    {
        AllRoleNames = new List<string>();
        UsersInRoles = new List<UserInRoles>();
    }

    public UserInRolesModel(List<string> allRoleNames, List<UserInRoles> usersInRoles)
    {
        AllRoleNames = allRoleNames;
        UsersInRoles = usersInRoles;
    }
}

public class UserInRoles
{
    public UserInRoles(string user, List<string> userRoles, IEnumerable<string> allRoleNames)
    {
        User = user;
        Roles = SetRoles(userRoles, allRoleNames);
    }

    private List<bool> SetRoles(List<string> userRoles, IEnumerable<string> allRoleNames)
    {
        return allRoleNames.Select(userRoles.Contains).ToList();
    }

    public string User { get; set; }
    public List<bool> Roles { get; set; }

    public void UpdateRoles(List<string> allRoleNames)
    {
        var roleProvider = (SimpleRoleProvider)System.Web.Security.Roles.Provider;

        var rolesAdded = new List<string>();
        for (int i = 0; i < Roles.Count; i++)
        {
            if (Roles[i])
            {
                rolesAdded.Add(allRoleNames[i]);
            }
        }
        roleProvider.AddUsersToRoles(new[] { User }, rolesAdded.ToArray());
    }
}
但我得到了一个空模型。(我现在只是担心角色名称列表,因为一旦我弄清楚它发生了什么,我也可以弄清楚我的UserInRoles对象列表发生了什么)

我可以找出MVC没有正确绑定的原因。这是因为生成的html如下所示:

<input id="AllRoleNames__0_" name="AllRoleNames.[0]" type="hidden" value="Admin">
Admin
<input id="AllRoleNames__1_" name="AllRoleNames.[1]" type="hidden" value="Extrator">
Extrator

管理
外星体
当名称属性应为“AllRoleNames[0]”时,它将被生成为“AllRoleNames。[0]”。那里有一个额外的点。于是,我找到了一个用黑客提出的答案。它可以工作,但当我测试时,我看到我的HtmlFieldPrefix已经没有圆点了,所以它当然不能工作

我的问题是,为什么MVC要用点来生成这些名称,有没有一种方法可以告诉它正确地生成这些名称?我希望我的问题很清楚,但如果不清楚,我可以提供更多细节。
提前谢谢

出现这种情况的原因是,您使用的是
for
循环,而不是
foreach
,请在
AllRoleNames
模板中尝试此操作:

foreach (var role in Model)
{
    @Html.HiddenFor(m => role)
    @Html.DisplayFor(m => role)
} 

希望有帮助。

我发现作为模型传递列表只会带来痛苦。如果你通过了一个包含列表的类,生活就会变得容易得多。然后,您可以使用for循环,事情将开始按照您期望的方式运行。i、 e

for(int i = 0; i < model.MyList.Count; i++)
{
    @Html.HiddenFor(model => model.MyList[i])
    @Html.DisplayFor(model  => model.MyList[i])
} 
for(int i=0;imodel.MyList[i])
@DisplayFor(model=>model.MyList[i])
} 

请正确填写您的物业名称。

你好,Daniele,谢谢您的回复。事实上,当我试图使用foreach语句时,我去掉了那个圆点。但它也可以去掉我的集合,因为生成的代码类似于所有项的“AllRoleNames.role”。您看到我丢失了列表中的[0]、[1]了吗?因此,当我发回时,它也不会绑定到模型。我很感激你的回答,但它不起作用……事实上,皮塔勒,我在模型中处理列表时没有取得好的结果。所以,通过你的回答,我发现我可以处理视图中的所有内容,而不需要显示模板。所以,正如您所建议的,我只是在for循环中使用了@Html.HiddenFor(m=>m.AllRoleNames[I])。此外,我还使用相同的逻辑来显示用户权限的复选框。谢谢你的回答。没问题……我也得自己苦学。
foreach (var role in Model)
{
    @Html.HiddenFor(m => role)
    @Html.DisplayFor(m => role)
} 
for(int i = 0; i < model.MyList.Count; i++)
{
    @Html.HiddenFor(model => model.MyList[i])
    @Html.DisplayFor(model  => model.MyList[i])
}