powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Binding Dictionary<int, bool> ASP.NET MVC
12 сообщений из 12, страница 1 из 1
Binding Dictionary<int, bool> ASP.NET MVC
    #39070293
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Не могу понять в чем проблема.

Есть модель:
Код: c#
1.
2.
3.
4.
5.
6.
public class SYSModel
    {
        public Dictionary<int, bool> SourceCode { get; set; }

        public string SamAccountName { get; set; }
    }


Есть View:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>SYS</title>
</head>
<body>
    <table border="0"> 
        @using (Html.BeginForm("SYS", "Home", FormMethod.Post))
        {
            @Html.ValidationSummary();
            
            foreach (KeyValuePair<int, bool> kvp in Model.SourceCode)
            {
                <tr>
                    <td>
                        @Html.LabelFor(x => kvp.Value, kvp.Key.ToString())
                    </td>
                    <td align="right">
                        @Html.CheckBoxFor(x => kvp.Value)
                    </td>
                </tr>                
            }            
            <tr>
                <td colspan="2">
                    @Html.TextBoxFor(tx => Model.SamAccountName, new { placeholder = "login", style = "width: 99%;" })
                </td>
                <td></td>
            </tr>
            <tr>
                <td colspan="2" align="right">
                    <input type="submit" value="APPLY" />
                </td>
                <td></td>
            </tr>
        }
    </table>
</body>
</html>



Контроллер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public ActionResult SYS()
        {
            SYSModel sModel = new SYSModel
            {
                SourceCode = Enum.GetValues(typeof(ESYS)).Cast<ESYS>().ToDictionary(x => (int)x, x => false)
            };

            return View(sModel);
        }

[HttpPost]
public ActionResult SYS(SYSModel sModel)
        {
            //Вот тут-то и вся проблема

            return View();
        }



При выполнении get метода все норм. Модель заполняется и вьюха соответственно тоже. Но при выполнении post метода, модель приходит с пустым SourceCode. Вне зависимости от того, отмечены ли чекбоксы или нет. Заполненным остается только SamAccountName. В чем проблема?
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070687
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlcПри выполнении get метода все норм. Модель заполняется и вьюха соответственно тоже. Но при выполнении post метода, модель приходит с пустым SourceCode. Вне зависимости от того, отмечены ли чекбоксы или нет. Заполненным остается только SamAccountName. В чем проблема?

Ты думаешь, что ASP.NET настолько magic , что молча соберет твою драндулу в словарик?
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070713
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monochromatique,

каким образом я могу помочь асп собрать мою драндулу (с) в словарик?
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070714
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueТы думаешь, что ASP.NET настолько magic , что молча соберет твою драндулу в словарик?... при том, что ему (View) никто не сказал даже имени параметра, в который надо собирать )
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070723
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ты наверное об этом
Код: c#
1.
2.
3.
4.
5.
@model TP.Models.SYSModel

@{
    Layout = null;
}



имеется.
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlc,

Я о том, что имя параметра "SourceCode" при генерации html НУ НИГДЕ не фигурирует. А без этого, какой бы ни был байндер умный, он не сможет заполнить твою модель - ну не знает он имени параметра, хоть убей.
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39070797
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Переписал как
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
foreach (var kvp in Model.SourceCode)
            {
            <tr>
                <td>
                    @Html.LabelFor(x => Model.SourceCode[kvp.Key], ((ESYS)kvp.Key).ToString())
                </td>
                <td align="right">
                    @Html.CheckBoxFor(x => Model.SourceCode[kvp.Key])
                </td>
            </tr>
            }



Однако в post метод передается SourceCode с count=0. В чем я сейчас ошибаюсь?
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39072121
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlc,

неужели никто не знает в чем ошибка? ау... профи...
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39072138
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый чекбокс должен обладать атрибутом name, соответствующим названию параметра контроллера. Но для вложенного свойства я не помню правильный формат. Почитай как работает байндер - вопросы отпадут. Ну или кто-то сейчас по памяти напишет, коль самому в документацию лень залезть.
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39072179
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставь Formcollection в параметры экшена и увидишь в каком форме приходят твоя форма, и скорее всего поймешь почему у тебя биндер не может создать коллекцию. скорее всего потому что у тебя приходить коллекция а не дикшенери как ты ожидаешь.
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39072969
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlc,
Надо сделать свой биндер, типа такого.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    public class MyModelBinder : IModelBinder
    {
        static Regex re = new Regex(@"SourceCode\[(\d+)\]", RegexOptions.Compiled | RegexOptions.IgnoreCase);
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var res = new MyViewModel() { SourceCode = new Dictionary<int, bool>() };
            var request = controllerContext?.HttpContext?.Request;
            if (request == null)
                return res;
            res.SamAccountName = request[nameof(res.SamAccountName)];
            var keys = request.Params.AllKeys.Where(x => re.IsMatch(x));
            foreach(var key in keys)
            {
                var tmp = request[key];
                var s = Convert.ToInt32(re.Match(key).Groups[1].Value);
                res.SourceCode[s] = Boolean.Parse(tmp.Split(',')[0]);
            }
            return res;
        }      
    }


Зарегистрировать его.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class BindersConfig
    {
        public static void RegisterBinders(ModelBinderDictionary binders)
        {
            binders.Add(typeof(MyViewModel), new MyModelBinder());
        }
    }
  protected void Application_Start()
        {
            .........
            BindersConfig.RegisterBinders(ModelBinders.Binders);
        }


И в представлении.
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<table>
        @foreach (var key in Model.SourceCode.Keys)
        {
                <tr>
                    <td>
                        <label>@key</label>
                    </td>
                    <td>
                        @Html.CheckBoxFor(m => m.SourceCode[key])
                    </td>
                </tr>

        }
    </table>
...
Рейтинг: 0 / 0
Binding Dictionary<int, bool> ASP.NET MVC
    #39076341
mlc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Спасибо за один из вариантов решения, но в моем случае оказалось все гораздо проще.
После внесенных изменений по совету Shocker.Pro
Shocker.Promlc,

Я о том, что имя параметра "SourceCode" при генерации html НУ НИГДЕ не фигурирует. А без этого, какой бы ни был байндер умный, он не сможет заполнить твою модель - ну не знает он имени параметра, хоть убей.
модель возвращалась уже не наловой, но с нулевым количеством элементов. Оказалось, что байндер почему то не хотел работать с Dictionary<int, bool> и простая замена на Dictionary<string, bool> все починила.

ASP.NET MVC Binding to a dictionary

З.Ы. Если кто знает ответ на вопрос: почему байндер не работает с Dictionary<int, bool>, просьба огласить причину.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Binding Dictionary<int, bool> ASP.NET MVC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]