2013-08-12 2 views
1

У меня есть следующие cshtml образуютПолучить выбранные элементы из CheckBoxList MVC.NET Razor

@using (Html.BeginForm(Html.BeginForm("Create", "UserRole", Model, FormMethod.Post))) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Role</legend> 

     <div class="editor-label"> 
      @Html.Label(Model.User.UserName) 
     </div> 
     <div class="editor-field"> 
      @Html.CheckBoxList(Model.CheckboxList) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

И я хочу, чтобы получить Model.CheckboxList выбранные товары в моем действии.

У меня есть следующий Создать действие в мой контроллер

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(UserRoleViewModel userRoleViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      //_context.Role.Add(role); 
      //_context.SaveChanges(); 
      //return RedirectToAction("Index"); 
     } 

     return View(viewModel); 
    } 

Однако viewModel.CheckboxList 0.

Как я могу передать выбранные значения CheckBoxList, а также Model.User к действие контроллера?

Мои ViewModel выглядит следующим образом: -

public User User { get; set; } 
    public IEnumerable<Role> RoleList { get; set; } 

    public List<UserRoleViewModel> UserList { get; set; } 

    public IEnumerable<SelectListItem> CheckboxList { get; set; } 

    public UserRoleViewModel() 
    { 
    } 

    public UserRoleViewModel(User user, IEnumerable<Role> roleList) 
    { 
     User = user; 
     RoleList = roleList; 
    } 

Спасибо за вашу помощь и время!

ОБНОВЛЕНИЕ ----------- После прочтения этого сообщения enter link description here, я попытался адаптировать мой код, чтобы следовать примеру, но я все еще нахожу проблемы с этим обновленным кодом.

Теперь у меня есть следующие: -

cshtml: -

@model IEnumerable<MvcMembership.ViewModels.RoleCheckboxListViewModel> 

    @using (Html.BeginForm()) 
    { 
     @Html.EditorForModel() 
     <input type="submit" value="OK" /> 
    } 

Просмотров/Роль/EditorTemplates/RoleCheckboxListViewModel.cshtml

@model MvcMembership.ViewModels.RoleCheckboxListViewModel 
@Html.HiddenFor(x => x.RoleId) 
@Html.HiddenFor(x => x.RoleName) 
<div> 
    @Html.CheckBoxFor(x => x.Checked) 
    @Html.LabelFor(x => x.Checked, Model.RoleName) 
</div> 

ViewModels: -

public class RoleCheckboxListViewModel 
{ 
    public string RoleId { get; set; } 
    public string RoleName { get; set; } 
    public bool Checked { get; set; } 
} 

и действие контроллера происходит следующим образом: -

 public ActionResult Create(int? uid) 
    { 
     var checkBoxList = new[] 
     { 
      new RoleCheckboxListViewModel() { 
        RoleId = "1", Checked = true, RoleName = "item 1" }, 
      new RoleCheckboxListViewModel() { 
        RoleId = "2", Checked = true, RoleName = "item 2" }, 
      new RoleCheckboxListViewModel() { 
        RoleId = "3", Checked = true, RoleName = "item 3" }, 
     }; 

     return View(checkBoxList); 
    } 

Проблема, которую я имею сейчас, заключается в том, что на Create.cshtml. Я не вижу список checkbox, но отображается только 123, а также кнопка OK.

Любая помощь была бы очень оценена, потому что я нахожусь в тупике на данный момент.

+0

Возможный дубликат [CheckboxList в MVC3 Просмотр и получение отмеченных элементов, переданных контроллеру] (http://stackoverflow.com/questions/5284395/checkboxlist-in-mvc3-view-and-get-the-checked- items-pass-to-the-controller) –

+0

уже посмотрел на это решение, но не помог, все еще возникают проблемы с сохранением viewModel – Johann

+0

Я не вижу 'public bool Checked {get; задавать; } 'для вашей модели. Пройдите через сообщение, которое я предложил полностью –

ответ

6

Я совершил это со следующими частями:

1) модель вида для дочернего элемента, который добавляет свойство Его, которое будет представлять ли не проверяется флажок в представлении позже ... то есть:

public class CategoryViewModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool Assigned { get; set; } 
} 

2) модель вида для родительский элемент, который добавляет свойство коллекции для этой новой модели представления ребенка элемента, а именно:

public class ManufacturerViewModel 
    { 
     public Manufacturer Manufacturer { get; set; } 
     public IList<CategoryViewModel> Categories { get; set; } 

     public ManufacturerViewModel() 
     { 
      Categories = new List<CategoryViewModel>(); 
     } 
    } 

3) Метод уровня обслуживания для получения списка всех дочерних элементов в том же время устанавливая свойство Его для каждого (» Назначено "в моем примере). Используется вашим контроллером.

public IList<CategoryViewModel> GetCategoryAssignments(Manufacturer mfr) 
     { 
      var categories = new List<CategoryViewModel>(); 
      foreach (var category in GetCategories()) 
      { 
       categories.Add(new CategoryViewModel 
       { 
        ID = category.ID, 
        Name = category.Name, 
        Assigned = mfr.Categories.Select(c => c.ID).Contains(category.ID) 
       }); 
      } 
      return categories; 
     } 

4) Способ обновления коллекции родительского элемента на основе выбранных вами флажков. Используется вашим контроллером.

public void UpdateCategories(string[] selectedCategories, ManufacturerViewModel form) 
     { 
      if (selectedCategories == null) 
       selectedCategories = new string[] { }; 
      var selectedIds = selectedCategories.Select(c => int.Parse(c)).ToList(); 
      var assignedIds = form.Manufacturer.Categories.Select(c => c.ID).ToList(); 
      foreach (var category in GetCategories()) 
      { 
       if (selectedIds.Contains(category.ID)) 
       { 
        if (!assignedIds.Contains(category.ID)) 
         form.Manufacturer.Categories.Add(category); 
       } 
       else 
       { 
        if (assignedIds.Contains(category.ID)) 
         form.Manufacturer.Categories.Remove(category); 
       } 
      } 
     } 

5) Изменения в вашем представлении «Создание/редактирование». т.е.:

@Html.EditorFor(model => model.Categories) 

Вы также должны добавить это, чтобы исходные назначенные значения были включены в данные для публикации. Вам нужно будет добавить HiddenFor для каждого свойства, которое вы установили как обязательное для проверки.

for (int i = 0; i < Model.Manufacturer.Categories.Count; i++) 
    { 
     @Html.HiddenFor(model => model.Manufacturer.Categories[i].ID); 
     @Html.HiddenFor(model => model.Manufacturer.Categories[i].Name); 
    } 

6) И, наконец, новый элемент EditorTemplate для вашего элемента модели просмотра ребенка. т.е.:

@model YourProject.ViewModels.CategoryViewModel 
<li> 
    <input type="checkbox" 
     id="@string.Format("cb{0}{1}", @Model.Name, @Model.ID)" 
     name="selectedCategories" //Notice this name corresponds to string[] selectedCategories so that it can be extracted from the post data 
     value="@Model.ID" 
     @(Html.Raw(Model.Assigned ? "checked=\"checked\"" : "")) /> 
    <label for="@string.Format("cb{0}{1}", @Model.Name, @Model.ID)">@Model.Name</label> 
    @Html.HiddenFor(model => model.ID) 
</li> 

Надеюсь, мое собственное приложение даст вам лучшее представление о том, как решить эту проблему.

2

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

var modelSelected = document.getElementById("modelName"); 
document.getElementById('selectedModel').value = 
    modelSelected.options[modelSelected.selectedIndex].text; 

<input id="selectedModel" name="selectedModel" type="hidden" runat="server" /> 
Смежные вопросы