C# 将复杂模型的列表中的问题绑定到mvc应用程序
我是使用.NETMVCWeb应用程序的新手。我正在使用Web应用程序的版本4。 我正在开发一个页面来管理简单成员资格提供者的角色,我希望它是动态的。为了弄清楚我的意思,应该是这样的: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
<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])
}