Как связать MultiSelectList со списком флажков?
например. Я передаю что-то подобное модели
model.Groups = new MultiSelectList(k.Groups, "Id", "Name", selectedGroups)
Как мне это визуализировать? Это не работает
<% foreach (var item in Model.Groups.Items) { %>
<input type="checkbox" name="groups" value="<%=item.Value%>" id="group<%=item.Value%>" checked="<%=item.Selected?"yes":"no"%>" />
<label for="group<%=item.Value%>"><%=item.Text%></label>
<% } %>
Ошибка CS1061: «объект» не содержит определения «Значение» ...
Есть ли вспомогательный метод HTML, который я могу использовать?
(Тогда, если он не простой , как мне вернуть выбранные значения обратно в контроллер при отправке формы?)
Я только что проверил, как мы можем увидеть, был ли изменен выбор.
public class Group {
public int ID { get; set; }
public string Name { get; set; }
}
//And some data to play with
var allGroups = new List<Group>();
allGroups.Add(new Group { ID = 1, Name = "one" });
allGroups.Add(new Group { ID = 2, Name = "two" });
allGroups.Add(new Group { ID = 3, Name = "three" });
var selectedGroups = new List<Group>();
selectedGroups.Add(allGroups[0]);
selectedGroups.Add(allGroups[2]);
var m = new MultiSelectList(allGroups, "ID", "Name",
selectedGroups.Select(x => x.ID));
//passed that data to the view with ViewData
ViewData["list"] = m;
Элементы флажка:
<% foreach (var item in (MultiSelectList)ViewData["list"]) { %>
<input type="checkbox" name="groups" value="<%=item.Value%>"
id="group<%=item.Value%>"
<%=item.Selected ? "checked=\"checked\"" : String.Empty%>/>
<label for="group<%=item.Value%>"><%=item.Text%></label>
<% } %>
В действии принят массив int:
[HttpPost]
public ActionResult SomeAction(int[] groups) {
if (groups != null) {
var postedSelection = allGroups.Where(x => groups.Contains(x.ID));
if (!selectedGroups.SequenceEqual(postedSelection)) {
//selection was changed
}
else {
//selection is the same
}
}
else {
//no group ID was posted
}
}
Надеюсь, это дает некоторое представление.
Я просто хотел поделиться своей реализацией, используя приведенный выше пример. Я заполняю свойства, которые организованы в пары ключ / значение в моей базе данных. В моем примере я сохраняю каждое свойство как пару значений ключа в Словаре. Каждый элемент в Словаре будет содержать строковый ключ, такой как «Цвет» и MultiSelectList со значениями, такими как DataValueField = «1», DataTextField = «Black» и т. Д.
Код VewModel
public Dictionary<string, MultiSelectList> Properties { get; private set; }
private void SetProperties()
{
this.Properties = new Dictionary<string, MultiSelectList>();
foreach(InventoryItemProperty property in new InventoryItemPropertyRepository().FindAllInventoryItemProperties())
{
this.Properties.Add(property.Key.Name, new MultiSelectList(property.Values, "Id", "Value"));
}
}
Просмотр разметки
<div id="editor-inventory-item-properties">
<% foreach(string key in Model.Properties.Keys){ %>
<div class="editor-label">
<label for="<%= key.ToLower() %>"><%= key %></label><br />
<% foreach(var item in Model.Properties[key]){ %>
<input type="checkbox"
id="<%= key.ToLower() + "-" + item.Text.ToLower() %>"
name="inventoryItemPropertyValues"
value="<%= item.Value %>"
<%= item.Selected ? "checked=\"checked\"" : string.Empty %> />
<label for="<%= key.ToLower() + "-" + item.Text.ToLower() %>">
<%= item.Text %></label><br />
<% } %>
</div>
<% } %>
</div>
Контроллер Код действия
//
// POST: /Admin/InventoryItems/Create
[HttpPost]
public ActionResult Create(InventoryItem inventoryItem, int[] inventoryItemPropertyValues)
{
try
{
inventoryItem.Created = DateTime.Now;
inventoryItem.LastUpdated = inventoryItem.Created;
this.inventoryItemRepository.Add(inventoryItem);
this.inventoryItemRepository.Save();
if(inventoryItemPropertyValues != null)
{
SaveInventoryItemPropertyValues(inventoryItem.Id, inventoryItemPropertyValues);
}
return RedirectToAction("Details", new { id = inventoryItem.Id });
}
catch
{
throw;
//return View();
}
}
private void SaveInventoryItemPropertyValues(int inventoryItemId, int[] inventoryItemPropertyValues)
{
for(int i = 0; i < inventoryItemPropertyValues.Length; i++)
{
this.inventory_Item_ProperytValueRepository.Add(new Inventory_Item_PropertyValue() { InventoryItemId = inventoryItemId, InventoryItemPropertyValueId = inventoryItemPropertyValues[i] });
}
this.inventory_Item_ProperytValueRepository.Save();
}