Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
MAH69K
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
Завершенные тесты: 2
1

Подмена модели через ajax-запрос

15.07.2015, 14:32. Просмотров 759. Ответов 9
Метки нет (Все метки)

Добрый день!
Есть представление для редактирования прав доступа юзеров:
C#
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
<div class="form-group">
        <select id="roles" name="roles">
            <option disabled="" selected="selected">Выбрать роль</option>
            @foreach (var t in (IEnumerable<SelectListItem>)ViewBag.Roles)
            {
                <option value=@t.Value>@t.Text</option>
            }
        </select>
    </div>
 
<table id="resources">
        @for (var i = 0; i < Model.ResourcesList.Count; i++)
        {
            <tr>
                <td>
                    @Html.DisplayFor(m => Model.ResourcesList[i].ResourceName)
                    @Html.HiddenFor(m => Model.ResourcesList[i].ResourceName)
                </td>
                <td>
                    @Html.LabelFor(m => Model.ResourcesList[i].Create)
                    @Html.CheckBoxFor(m => Model.ResourcesList[i].Create, "Create")
                </td>
                //остальные чекбоксы
            </tr>
        }
    </table>
    <input type="submit" value="Сохранить изменения" />
Модель представляет из себя ID пользователя и список доступных ресурсов, который состоит из названия ресурса и булевых переменных для доступа к методам контроллера
Если чекбоксы проставлять руками, то данные сохраняются, если же выбрать из выпадающего списка роль, то чекбоксы проставляются, но данные не сохраняются.
Сам скрипт:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
$(document).ready(function () {
    $("#roles").change(function () {
        $.ajax({
            type: "GET",
            data: { id: $("option:selected", this).attr("value") },
            url: "/Admin/GetRole",
            success: function (data) {
                $("#resources").html(data);
            }
        });
    });
});
Обращается скрипт к частичному представлению, которое возвращает список ресурсов для выбранной роли:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<table id="resources">
    @for (var i = 0; i < Model.Count; i++)
    {
        <tr>
            <td>
                @Html.DisplayFor(m => Model[i].ResourceName)
                @Html.HiddenFor(m => Model[i].ResourceName)
            </td>
 
            <td>
                @Html.LabelFor(m => Model[i].Create)
                @Html.CheckBoxFor(m => Model[i].Create, "Create")
            </td>
            //остальные чекбоксы
        </tr>
    }
</table>
Собственно пробовал replaceWith и load в скрипте, ничего не помогает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2015, 14:32
Ответы с готовыми решениями:

Не получается отправить ajax запрос через JQuery
Есть форма с текстовыми полями и кнопкой submit. Внизу располагается панель с картинками. Мне...

Ajax запрос через прокси!
Всем доброго времени суток! На сайте использую скрипт, который выполняет Ajax запрос вида: result =...

Простой запрос через AJAX
Помогите сделать задачку. С AJAX вообще разобраться не получается( Технология AJAX. Объект...

Периодический запрос данных из бд через ajax
Доброй ночи! Помогите разобраться и решить проблему. Необходимо при загрузке страницы через ajax...

Не проходит post запрос через ajax
Здравствуйте, делаю загрузку аватара. Всё работало, решил сделать через popup окно с помощью js и...

9
antesoft
106 / 18 / 4
Регистрация: 08.06.2013
Сообщений: 62
17.07.2015, 12:38 2
а как метод выглядит, который отправляет частичное представление?
0
MAH69K
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
Завершенные тесты: 2
17.07.2015, 13:44  [ТС] 3
C#
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
[HttpGet]
        public async Task<ActionResult> GetRole(string id)
        {
            var roleResources = ((await _roleService.GetRole(id)).Resources).ToList();
            var resources = await _resourceService.GetResources();
            var model = new List<Resource>();
            foreach (var resource in resources)
            {
                var tempRes = roleResources.Find(x => x.ResourceName == resource.ResourceName);
                if (tempRes != null)
                {
                    if (resource.ResourceName == tempRes.ResourceName)
                    {
                        model.Add(
                            new Resource
                            {
                                ResourceName = tempRes.ResourceName,
                                Create = tempRes.Create,
                                View = tempRes.View,
                                Edit = tempRes.Edit,
                                Delete = tempRes.Delete
                            });
                    }
                }
                else
                {
                    model.Add(
                        new Resource
                        {
                            ResourceName = resource.ResourceName,
                            Create = resource.Create,
                            View = resource.View,
                            Edit = resource.Edit,
                            Delete = resource.Delete
                        });
                }
            }
            return PartialView("GetRole", model);
        }
Собственно вот метод, возвращающий частичное представление
0
antesoft
106 / 18 / 4
Регистрация: 08.06.2013
Сообщений: 62
17.07.2015, 14:22 4
MAH69K, а через отладку смотрели? не только на стороне сервера, но и в браузере в консоли js, может там какая-нибудь ошибка выскакивает
0
MAH69K
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
Завершенные тесты: 2
17.07.2015, 14:53  [ТС] 5
Метод getPreventDefault() является устаревшим. Для его замены используйте метод defaultPrevented.

Хотя пишут, что это не играет роли
0
Listorat
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
22.07.2015, 18:51 6
Javascript
1
2
3
   success: function (data) {
                $("#resources").html(data);
            }
Посмотри в отладчике браузера, что приходит в "data" ?
0
MAH69K
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
Завершенные тесты: 2
28.07.2015, 11:58  [ТС] 7
Проблема была в том, что частичное представление возвращало в качестве модели просто список ресурсов:
C#
1
var model = new List<Resource>();
Заменил модель на:
C#
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
public async Task<ActionResult> GetRole(string id)
        {
            var roleResources = ((await _roleService.GetRole(id)).Resources).ToList();
            var resources = await _resourceService.GetResources();
            var modelResources = new List<Resource>();
            var model = new ClaimModel { UserId = null };
            foreach (var resource in resources)
            {
                var tempRes = roleResources.Find(x => x.ResourceName == resource.ResourceName);
                if (tempRes != null)
                {
                    if (resource.ResourceName == tempRes.ResourceName)
                    {
                        modelResources.Add(
                            new Resource
                            {
                                ResourceName = tempRes.ResourceName,
                                Create = tempRes.Create,
                                View = tempRes.View,
                                Edit = tempRes.Edit,
                                Delete = tempRes.Delete
                            });
                    }
                }
                else
                {
                    modelResources.Add(
                        new Resource
                        {
                            ResourceName = resource.ResourceName,
                            Create = resource.Create,
                            View = resource.View,
                            Edit = resource.Edit,
                            Delete = resource.Delete
                        });
                }
            }
            model.ResourcesList = modelResources;
            return PartialView("GetRole", model);
        }
Проблема решилась. Модель парсится из разметки страницы, а при замене на другую модель, после обращения к частичному представлению, контроллер не видел ничего, что ему нужно было сохранить в БД.
0
Listorat
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
29.07.2015, 11:56 8
MAH69K, я если честно не фига не понял))
А можешь объяснить зачем при каждом обращении к сервису ( я так понял он данные из бд тянет ) используешь async/await? Что будет если просто ActionResult класс юзать ?
0
MAH69K
6 / 6 / 3
Регистрация: 23.05.2011
Сообщений: 25
Завершенные тесты: 2
29.07.2015, 15:53  [ТС] 9
Насколько я понимаю, при рендеринге страницы контроллер передает во вьюху html-данные, которые строятся исходя из модели, имена чекбоксам назначаются в соответствии с этой моделью, при нажатии на кнопку сохранения студия парсит разметку страницы, находит нужные ей чекбоксы, которым она сама и выдала имена, и выдирая эти данные передает их обратно в модель контроллера.
Асинхронность у нас везде, поэтому async/await
0
Listorat
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
29.07.2015, 17:16 10
MAH69K, в ActionResult тоже асинхронность. Так в чем разница? за исключением скорости выполнения при 200к запросов
0
29.07.2015, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 17:16

Передача данных через Ajax-запрос
Не могу понять, как правильно передавать и принимать несколько переменных через Ajax-запрос.. С...

Получение данных из сессии через ajax запрос
Здравствуйте, делаю корзину покупок при помощи get запроса почти работает но не как не могу вернуть...

AJAX запрос к файлу, который сам делает AJAX запрос
Прошу прощение за название темы, но я не знаю как это коротко описать... Здравствуйте. На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru