Привязка проблем выбранных элементов из списка - PullRequest
1 голос
/ 25 октября 2011

У меня момент.Я не могу заставить выбранные элементы из ListBox быть привязанными в параметре к методу действия, который обрабатывает событие post.

Model имеет тип SystemRoleList:

public class SystemRoleList {
    public IEnumerable<SystemRole> List { get; set; }
}

SystemRole определяется как:

public class SystemRole {
    public Int32 Id { get; set; }

    public String Name { get; set; }
}

Этот код генерирует ListBox:

<%: this.Html.ListBox("Roles", new SelectList(Model.List, "Id", "Name")) %>

Установлен метод действия для получения выбранных элементоввот так:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateSystemRoles(Int32[] roles) {
    // do something with the results....
}

Беда в том, что roles всегда null.Я пытался использовать другие типы данных - string[], ICollection<int> и так далее.Я могу видеть значения в коллекции Request.Form, если я сделаю Request.Form["Roles[]"].Типичные значения могут быть 1,3,4, если я выбрал эти элементы из ListBox.

Как я могу назвать либо ListBox, либо мой параметр, чтобы MVC автоматически связывал значения?

1 Ответ

1 голос
/ 25 октября 2011

Странно, у меня прекрасно работает следующее.

Модель:

public class SystemRoleList
{
    public IEnumerable<SystemRole> List { get; set; }
}

public class SystemRole
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Контроллер:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new SystemRoleList
        {
            List = new[]
            {
                new SystemRole { Id = 1, Name = "role 1" },
                new SystemRole { Id = 2, Name = "role 2" },
                new SystemRole { Id = 3, Name = "role 3" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(int[] roles)
    {
        return Content("thanks for submitting");
    }
}

Вид:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Controllers.SystemRoleList>" 
%>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <% using (Html.BeginForm()) { %>
        <%= Html.ListBox("Roles", new SelectList(Model.List, "Id", "Name")) %>
        <button type="submit">OK</button>
    <% } %>

</asp:Content>

При этом я буду использовать строго типизированную версию помощника ListBox, например:

Модель:

public class SystemRoleList
{
    public int[] Roles { get; set; }
    public IEnumerable<SystemRole> List { get; set; }
}

Контроллер:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new SystemRoleList
        {
            List = new[]
            {
                new SystemRole { Id = 1, Name = "role 1" },
                new SystemRole { Id = 2, Name = "role 2" },
                new SystemRole { Id = 3, Name = "role 3" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SystemRoleList model)
    {
        return Content("thanks for submitting");
    }
}

Вид:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Controllers.SystemRoleList>" 
%>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <% using (Html.BeginForm()) { %>
        <%= Html.ListBoxFor(x => x., new SelectList(Model.List, "Id", "Name")) %>
        <button type="submit">OK</button>
    <% } %>

</asp:Content>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...