簡體   English   中英

將復雜模型的列表中的問題綁定到mvc應用程序

[英]Binding issue in a list at a complex model to an mvc application

我是使用.NET MVC Web應用程序的新手。 我正在使用Web應用程序的第4版。 我正在開發一個頁面來管理簡單成員資格提供者的角色,我希望它是動態的。 為了清楚我的意思,它將是這樣的:

UsersInRoles

這樣的事情非常簡單。 為此,我有一個復雜的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM