Вопрос по c#-4.0, asp.net-mvc, c#, checkbox – Динамически создавать флажки и выбрать некоторые из них как отмеченные

4

Так что моя проблема выглядит так,

У меня есть два списка

СПИСОК А содержит.

Item 1 Item 2 Item 3 Item 4 Item 5

И список B содержит

Item 1 Item 2 Item 3 Item 4 ..... .... Item 10

Все, что я хочу сделать, это динамически генерировать флажки в MVC Razor View для всех элементов в B, и из этих флажков установить (выбрать) все флажки для всех элементов в A. Поскольку A всегда будет подмножеством B.

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

Любая помощь ?

UPDATE 1: Я могу получить все элементы в Model.CheckboxSelections в поле зрения. Я не хочу использовать частичное представление. Я пытаюсь что-то вроде следующего, но что-то все еще не хватает.

<code>         @for (int i = 0; i < Model.CheckboxSelections.Count; i++)
        {
@Html.CheckBox(Model.CheckboxSelections[i].Sku.ToString(), Model.CheckboxSelections[i].IsChecked.ToString())
     }
</code>
MVC Add Checkbox Dynamically а такжеHow to create controls dynamically in MVC 3 Joshua Drake

Ваш Ответ

1   ответ
11

редложения:

As always in ASP.NET MVC application you should use a view model.

Так:

public class MyViewModel
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

затем контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // Those are your domain models
        // they could come from a database or something
        var listA = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
        var listB = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" };

        // Now let's map our domain model to our view model
        var model = listB.Select(x => new MyViewModel
        {
            Name = x,
            IsChecked = listA.Contains(x)
        });

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        var selectedItems = model.Where(x => x.IsChecked);
        var format = string.Join(",", selectedItems.Select(x => x.Name));
        return Content("Thank you for selecting " + format);
    }
}

тогда соответствующий вид (~/Views/Home/Index.cshtml):

@model IEnumerable<MyViewModel>

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

и, наконец, соответствующий шаблон редактора, который будет автоматически отображаться для каждого элемента коллекции моделей (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyViewModel

<div>
    @Html.HiddenFor(x => x.Name)
    @Html.LabelFor(x => x.IsChecked, Model.Name)
    @Html.CheckBoxFor(x => x.IsChecked)
</div>

и результат рендеринга (как видно из моего браузера Chrome) выглядит так:

enter image description here

Посмотрите, как легко, когда вы используете модели просмотра?

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Nanu
Error: User Rate Limit Exceeded Nanu
Error: User Rate Limit Exceeded Nanu
Error: User Rate Limit Exceeded

Похожие вопросы