asp.net-mvc - mvc教學 - asp.net mvc vs asp.net core



在ListBoxFor中選擇值的挑戰 (2)

我不知道這個行為是否在我正在使用的MVC3的RTM中發生了變化,但似乎選擇和綁定現在開箱即用。 唯一的問題是模型應該包含帶有ID的屬性,如下所示:

public class MyViewModel {
    public int[] ItemIDs { get; set; }
}

然後視圖中的以下內容將正常工作,既可以預先選擇正確的值,也可以在發布期間正確綁定:

@Html.ListBoxFor(model => model.ItemIDs, (IEnumerable<SelectListItem>)(new[] { 
                                new SelectListItem() { Value = "1", Text = "1" }, 
                                new SelectListItem() { Value = "2", Text = "2" } 
                             }))

最近在我的第一個ASP.Net MVC2 Web應用程序上工作時,當我需要在列錶框中選擇多個值時,我遇到了一些問題。 我用一些jQuery解決了這個問題,但是繼續編寫了一些非常簡單的代碼來演示。 我使用EF作為模型,有兩個實體 - Customers和HelpDeskCalls:

控制器:

 public ActionResult Edit(int id)
    {
        Customer currCustomer = ctx.Customers.Include("HelpDeskCalls").Where(c => c.ID == id).FirstOrDefault();
        List<HelpDeskCall> currCustCalls = (ctx.HelpDeskCalls.Where(h => h.CustomerID == id)).ToList();
        List<SelectListItem> currSelectItems = new List<SelectListItem>();
        List<String> selectedValues = new List<string>();
        foreach (HelpDeskCall currCall in currCustCalls)
        {
            bool isSelected = (currCall.ID % 2 == 0) ? true : false;
            //Just select the IDs which are even numbers...
            currSelectItems.Add(new SelectListItem() { Selected = isSelected, Text = currCall.CallTitle, Value = currCall.ID.ToString() });
            //add the selected values into a separate list as well...
            if (isSelected)
            {
                selectedValues.Add(currCall.ID.ToString());
            }
        }
        ViewData["currCalls"] = (IEnumerable<SelectListItem>) currSelectItems;
        ViewData["currSelected"] = (IEnumerable<String>) selectedValues;
        return View("Edit", currCustomer);
    }

視圖:

<div class="editor-field">
    <%: Html.ListBoxFor(model => model.HelpDeskCalls, new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable) ViewData["currSelected"]), new { size = "12" })%>       
    <%: Html.ListBoxFor(model => model.HelpDeskCalls, ViewData["currCalls"] as IEnumerable<SelectListItem>, new { size = "12"}) %>
    <%: Html.ListBox("Model.HelpDeskCalls", new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable)ViewData["currSelected"]), new { size = "12"}) %>      
    <%: Html.ValidationMessageFor(model => model.HelpDeskCalls) %>
</div>

對於這個示例,我只是選擇均勻的HelpDeskCall.IDs。 我正在為ListBoxFor嘗試兩種不同的語法:一種使用IEnumerable值進行選擇,一種使用IEnumerable的SelectListItems。 默認情況下,當我運行此代碼時,不會對ListBoxFor進行任何選擇,但非強類型ListBox會正確選擇。

我在ASP上閱讀了這篇帖子 ,關於SO的這個帖子 ,但沒有快樂。 實際上,如果我將覆蓋ToString()添加到我的HelpDeskCall類(如ASP.net線程中所建議的那樣),則選擇所有值,這也是不對的。

如果有人能夠闡明這應該如何運作(以及我錯過或做錯了什麼),那麼新手就會非常感激。


Answer #1

我找到了更好的解決方法。 通常的方式來預選選擇列表:

@Html.ListBoxFor(
    model => model.Roles, 
    new MultiSelectList(db.Roles, "Id", "Name")
)
@Html.ValidationMessageFor(model => model.Roles)    

不起作用..,從未選擇任何選項,直到:

public ActionResult Edit(int id)
{
    var user = db.Users.Find(id);
    // this is workaround for http://aspnet.codeplex.com/workitem/4932?ProjectName=aspnet
    ViewData["Roles"] = user.Roles.Select(r => r.Id);
    return View(user);
}

選定的角色必須存儲在ViewData中,以解決令人討厭的錯誤。





asp.net-mvc-2