none
MVC3 как принять из формы 100 полей checkbox RRS feed

  • Вопрос

  • Здравствуйте.

    Проект MVC4

    есть форма:

    <form>

    <input name="partner_1" type="checkbox" id="partner_1" value="true" />

    .............................

    <input name="partner_100" type="checkbox" id="partner_100" value="true" />

    </form>

    есть view model

    public class ViewModel

    {

    public bool partner1 {get; set;}

    ...........................................

    public bool partner100 {get; set;}

    }

    и есть контролл с методом:

    public class MyController : Controller

    [HttpPost]
    public ActionResult Partner(ViewModel partner)
            {
                return View();
            }

    Подскажите пожалуйста способ передачи из формы 100 полей checkbox, что бы уменьшить количество кода и не прописывать во View model и в контролле все 100 наименований.

    Спасибо.

Ответы

  • Делайте список чекбоксов с одинаковым name, разным value. На сервер придут только отмеченные значения, как массив строк:

      public class SomeController : Controller
        {
            public ActionResult Index()
            {
                string [] values = new string[] { "aaa", "bbb", "ccc" };
                return View(values);
            }
    
            public ActionResult DoSomething(string[] checkedValues)
            {
                foreach (string checkedValue in checkedValues)
                {
                    Trace.WriteLine(checkedValue);
                }
    
                return new EmptyResult();
            }
        }

    @model string[]
    
    @using (Html.BeginForm("DoSomething", "Some", FormMethod.Post))
    {
        foreach (string value in Model)
        {
            <label><input type="checkbox" name="checkedValues" value="@value">@value</label> <br/>
        }
        <input type="submit"/>
    }

    9 июля 2012 г. 15:39
  • Как ещё один вариант, можно и так:

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    @model Dictionary<string, bool>
    <html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <div>
            <form action="@Url.Action("FormReader")" method="post">
                @foreach (var item in Model)
                {
                    <input type="checkbox" name="@item.Key" id="@item.Key" />
                }
                <input type="submit" title="Отправить" />
            </form>
        </div>
    </body>
    </html>

    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Mvc;
    
    namespace HundredCheckBox.Controllers
    {
        public class TestController : Controller
        {
            //
            // GET: /Test/
    
            public ActionResult Test()
            {
                Dictionary<string, bool> model = new Dictionary<string, bool>();
                for (int i = 0; i < 100; i++)
                    model.Add("partner" + i, false);
                return View(model);
            }
            public ActionResult FormReader([ModelBinder(typeof(HundredCheckBoxModelBinder))]Dictionary<string, bool> checkedValues)
            {
                return new EmptyResult();
            }
        }
        public class HundredCheckBoxModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                Dictionary<string, bool> checkedValues = new Dictionary<string, bool>();
                foreach (var i in controllerContext.HttpContext.Request.Form.AllKeys.Where(p => p.Contains("partner")))
                    checkedValues.Add(i, true);
                return checkedValues;
            }
        }
    }

    9 июля 2012 г. 17:39
    Модератор

Все ответы

  • Обычно форма используется для редактирования и передачи одной сущности, а сто записей получается уже таблица. Чтобы автоматизировать этот процесс можно определить собственную реализацию стандартной привязки моделей. А Вы можете описать задачу в целом? Лучше попробовать найти правильный подход к задаче более высокого уровня, чем пытаться найти решение задачи возникшей в результате неверного моделирования, эффективное решение котой скорее всего отсуствует.
    Модератор
  • Здравствуйте.

    Задача такая:

    Есть портал объявлений. На этапе регистрации партнера(тот который размещает информацию о себе) есть форма, где он четко отмечает виды деятельности ну и т.д.  - это делается чекбоксами. Разделение такое нужно что бы партнеру приходили извещения только четко таргетированные с его видом деятельности  запросы.

    Вот в связи с этим и вопрос был. Думал может как-то сериализовать ключ-значение, и в БД, но прочитал что это нарушает паттерны реляционных бд. Сериализация ,наверное больше времени займет. Так что пришел к выводу что просто сделать отношение многие ко многим в бд (т.е. вид: деятельности1 = партнер1 и т.д.). Но обрабатывать в коде 100 позиций не могу придумать как, может как то в виде массива или.... В общем посоветуйте как реализовать.

  • Делайте список чекбоксов с одинаковым name, разным value. На сервер придут только отмеченные значения, как массив строк:

      public class SomeController : Controller
        {
            public ActionResult Index()
            {
                string [] values = new string[] { "aaa", "bbb", "ccc" };
                return View(values);
            }
    
            public ActionResult DoSomething(string[] checkedValues)
            {
                foreach (string checkedValue in checkedValues)
                {
                    Trace.WriteLine(checkedValue);
                }
    
                return new EmptyResult();
            }
        }

    @model string[]
    
    @using (Html.BeginForm("DoSomething", "Some", FormMethod.Post))
    {
        foreach (string value in Model)
        {
            <label><input type="checkbox" name="checkedValues" value="@value">@value</label> <br/>
        }
        <input type="submit"/>
    }

    9 июля 2012 г. 15:39
  • Как ещё один вариант, можно и так:

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    @model Dictionary<string, bool>
    <html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <div>
            <form action="@Url.Action("FormReader")" method="post">
                @foreach (var item in Model)
                {
                    <input type="checkbox" name="@item.Key" id="@item.Key" />
                }
                <input type="submit" title="Отправить" />
            </form>
        </div>
    </body>
    </html>

    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Mvc;
    
    namespace HundredCheckBox.Controllers
    {
        public class TestController : Controller
        {
            //
            // GET: /Test/
    
            public ActionResult Test()
            {
                Dictionary<string, bool> model = new Dictionary<string, bool>();
                for (int i = 0; i < 100; i++)
                    model.Add("partner" + i, false);
                return View(model);
            }
            public ActionResult FormReader([ModelBinder(typeof(HundredCheckBoxModelBinder))]Dictionary<string, bool> checkedValues)
            {
                return new EmptyResult();
            }
        }
        public class HundredCheckBoxModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                Dictionary<string, bool> checkedValues = new Dictionary<string, bool>();
                foreach (var i in controllerContext.HttpContext.Request.Form.AllKeys.Where(p => p.Contains("partner")))
                    checkedValues.Add(i, true);
                return checkedValues;
            }
        }
    }

    9 июля 2012 г. 17:39
    Модератор
  • Привет.

    Пожалуйста, не забудьте отметить ответ, который решает вашу проблему. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'.

    Спасибо.


    Для связи [mail]

    10 июля 2012 г. 8:00
    Модератор