[英]Binding issue in a list at a complex model to an mvc application
我是使用.NET MVC Web應用程序的新手。 我正在使用Web應用程序的第4版。 我正在開發一個頁面來管理簡單成員資格提供者的角色,我希望它是動態的。 為了清楚我的意思,它將是這樣的:
這樣的事情非常簡單。 為此,我有一個復雜的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());
}
}
在我的視圖中,我有類似的東西來顯示角色名稱:
<th><strong>@Html.DisplayFor(m => m.AllRoleNames, "AllRoleNames")</strong></th>
而且,我有一個DisplayTemplates文件夾,其中包含AllRoleNames.cshtml文件,這里面是什么(我不擔心頁面的布局):
@model List<string>
@if (Model != null)
{
for (int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(m => m[i])
@Html.DisplayFor(m => m[i])
}
}
到現在為止還挺好。 它正確顯示名稱。 但是,當我嘗試按下Save按鈕時,MVC應該從html中獲取正確的名稱以綁定到HTTP Post Controller Action中的對象Model:
[HttpPost]
public ActionResult AdminUsers(UserInRolesModel model)
{
//code to save roles goes here
return View(model);
}
但我得到一個空模型。 (我只是擔心現在的角色名稱列表,因為一旦我弄清楚它發生了什么,我也可以弄清楚我的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
name屬性生成為“AllRoleNames。[0]”時應為“AllRoleNames [0]”。 那里有一個額外的點。 所以,我發現這個問題的答案提出了一個黑客。 它可以工作,但是當我測試時,我看到我的HtmlFieldPrefix已經沒有點,所以當然它不起作用。
我的問題是,為什么MVC用點生成這些名稱,有沒有辦法告訴它正確生成它? 我希望我的問題很清楚,但如果沒有,我可以提供更多細節。 提前致謝!
我發現傳遞List作為模型只不過是痛苦。 如果傳遞包含List生命的類變得更容易。 然后,您可以使用for循環,事情將按照您期望的方式開始。 即
for(int i = 0; i < model.MyList.Count; i++)
{
@Html.HiddenFor(model => model.MyList[i])
@Html.DisplayFor(model => model.MyList[i])
}
應該正確地產生你的屬性名稱。
這是因為你使用for
循環而不是foreach
,在AllRoleNames
模板中嘗試使用它:
foreach (var role in Model)
{
@Html.HiddenFor(m => role)
@Html.DisplayFor(m => role)
}
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.