Странность ViewBag при создании MultiSelectList - PullRequest
2 голосов
/ 28 декабря 2011

Я потратил много времени, просматривая различные форумы для получения помощи по MultiSelectLists в asp.net MVC3.Наконец-то разобрался, как решить мою проблему, теперь я пытаюсь сократить свой код и наткнулся на что-то странное с ViewBags.Сначала код, затем я объясню поведение.

Моя функция, которая создает MultiSelectList для использования контроллером

public MultiSelectList GetPermissionList(string[] selectedValues)
        {

            List<SelectListItem> permissions = new List<SelectListItem>()
            {

                new SelectListItem{ Value = "", Text = "None"},
                new SelectListItem{ Value = "View", Text = "View"},
                new SelectListItem{ Value = "Add", Text = "Add"},
                new SelectListItem{ Value = "Edit", Text = "Edit"},
                new SelectListItem{ Value = "Delete", Text = "Delete"}
            };
            return new MultiSelectList(permissions, "Value", "Text", selectedValues);
        }

частичный код издействие редактирования из контроллера

public ActionResult Edit(int id)
        { 
            ViewBag.Title = "Edit a Security Role";
            SecurityRoles securityroles = Repository.Details(id);


            ViewBag.Orders = securityroles.Orders.Split(',');
            ViewBag.OrdersListBox = GetPermissionList(ViewBag.Orders);

            return View(securityroles); 
        }

частичный код из View

<td class="rightAlign topAlign editor-label">
  @Html.MyLabel(m => m.Orders, "lblOrders")   
</td>
<td class="editor-field">  
  @Html.ListBoxFor(m => m.Orders, ViewBag.OrdersListBox as MultiSelectList, new { size = "5" }) 
</td>

Имейте в виду, я вырезал большой кусоккод из действия редактирования, у меня есть примерно 9 списков, которые я создаю для этого менеджера ролей безопасности.

Моя цель в действии редактирования состоит в том, чтобы просто иметь 1 строку кода, вызывая GetPermissionList и его возвращение в пакет просмотра, чтобы я мог просто отобразить его в виде, в отличие от двух строк в списке, которые у меня есть в настоящее время.

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

ViewBag.OrdersListBox = GetPermissionList (securityroles.Orders.Split (','));

Это должно работать, новыбранные значения не проходят.Чтобы усугубить странность, я попробовал еще кое-что, и оно работало нормально, но не имеет смысла почему.

ViewBag.Orders = securityroles.Orders.Split (',');

ViewBag.OrdersListBox = GetPermissionList (securityroles.Orders.Split (','));

ViewBag.Orders не играет роли в ViewBag.OrdersListBox и не используется в представлении, но когда я просто присваиваю ему значение, работает вторая строка кода.

Имеет ли это смысл для кого-либо?Любые предложения о том, как создать способ GetPermissionList , чтобы он просто работал правильно, отправив ему строковый массив вместо передачи ему объекта ViewBag?

1 Ответ

1 голос
/ 28 декабря 2011

Я думаю, вы должны установить Orders, потому что это то, к чему привязаны выбранные значения, когда происходит выбор. Вы можете просто передать строку [], если не хотите, чтобы что-то было предварительно выбрано. Проверьте ответ Дарина в этом посте. Он использует модель, но я думаю, что та же концепция применима и к сумке для просмотра.

Мультиселект с ViewModel

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