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

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

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

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

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

@{
    Layout = null;
}



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

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

неужели никто не знает в чем ошибка? ау... профи...
...
Рейтинг: 0 / 0
08.10.2015, 16:23
    #39072138
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding Dictionary<int, bool> ASP.NET MVC
Каждый чекбокс должен обладать атрибутом name, соответствующим названию параметра контроллера. Но для вложенного свойства я не помню правильный формат. Почитай как работает байндер - вопросы отпадут. Ну или кто-то сейчас по памяти напишет, коль самому в документацию лень залезть.
...
Рейтинг: 0 / 0
08.10.2015, 16:50
    #39072179
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding Dictionary<int, bool> ASP.NET MVC
поставь Formcollection в параметры экшена и увидишь в каком форме приходят твоя форма, и скорее всего поймешь почему у тебя биндер не может создать коллекцию. скорее всего потому что у тебя приходить коллекция а не дикшенери как ты ожидаешь.
...
Рейтинг: 0 / 0
09.10.2015, 14:28
    #39072969
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding Dictionary<int, bool> ASP.NET MVC
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
14.10.2015, 11:37
    #39076341
mlc
mlc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding Dictionary<int, bool> ASP.NET MVC
ЕвгенийВ,

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

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

ASP.NET MVC Binding to a dictionary

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


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