Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
kingass
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
1

Ajax.ActionLink срабатывает(вызывается) несколько раз подряд

04.07.2016, 11:03. Просмотров 1109. Ответов 7
Метки нет (Все метки)

Всем привет! Такая проблема. Есть Ajax хелпер:

C#
1
@Ajax.ActionLink("Remove from friends", "RemoveFriend", new { id = friend.Id }, new AjaxOptions { UpdateTargetId = "content"})
Когда вызывается соответствующий контроллер в первый раз то все ок. А когда нажимаю это же ссылку только для другого id вызывается уже несколько раз... бывает 3-5 раз. Это же ненормально. В чем может быть проблема??

p.s. погуглил про бандлы и последовательность скриптов, врооооде все ок. но скрин на всякий случай прикреплю
0
Миниатюры
Ajax.ActionLink срабатывает(вызывается) несколько раз подряд  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2016, 11:03
Ответы с готовыми решениями:

При использовании ActionLink данные в базу добавляются несколько раз
Здравствуйте! Такая проблема, в частичном представлении GetItems выводится список работ...

Не работает Ajax.ActionLink()
Не могу понять по какой причине не работает Ajax.ActionLink() вот код: @model...

Повторный асинхронный вызов через Ajax.ActionLink
Заметил что Ajax.ActionLink дергает действие контроллера с текущими параметрами только 1 раз, потом...

При нажатии на Ajax.ActionLink() открывается новое представление
Всем привет. Когда нажимаю на Ajax.ActionLink() открывается в отдельном окне частичное...

Как отключить Ajax.ActionLink на время выполнения действия
Метод выполняется довольно долго и обработка повторных нажатий на ссылку в это время не требуется....

7
Usaga
Эксперт .NET
5682 / 3916 / 701
Регистрация: 21.01.2016
Сообщений: 15,441
Завершенные тесты: 2
04.07.2016, 11:40 2
kingass, весь код покажи. От скриншота толку нет.
0
kingass
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
04.07.2016, 11:55  [ТС] 3
Весь код html страницы? представления? контроллера?
0
Usaga
Эксперт .NET
5682 / 3916 / 701
Регистрация: 21.01.2016
Сообщений: 15,441
Завершенные тесты: 2
04.07.2016, 11:58 4
kingass, код представления и контроллера.
0
04.07.2016, 11:58
kingass
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
04.07.2016, 14:15  [ТС] 5
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
[Authorize]
    public class FriendController : Controller
    {
        private readonly IUserService _userService;
        private readonly ITouchWithFriendService _touchWithFriendService;
        private readonly IProfileService _profileService;
 
        public FriendController(IUserService userService, ITouchWithFriendService touchWithFriendService,
            IProfileService profileService)
        {
            _userService = userService;
            _touchWithFriendService = touchWithFriendService;
            _profileService = profileService;
        }
 
        public ActionResult Index()
        {
            var user = GetCurrentUser();
 
            if (user == null)
                RedirectToAction("Index", "Home");
 
            GetDataAboutFriends(user.Id);
 
            return View();
        }
 
        public ActionResult ShowFriend(string id)
        {
            if (string.IsNullOrEmpty(id))
                RedirectToAction("Index", "User");
 
            int userId;
            int.TryParse(id, out userId);
 
            UserViewModel userForShow = _userService.GetById(userId).ToMvcUser();
            ProfileViewModel profile = _profileService.GetById(userId).ToMvcProfile();
 
 
            if (IsFriend(userForShow.Email))
                ViewBag.IsFriend = true;
 
            ViewBag.User = userForShow;
            ViewBag.Path = profile.ImagePath;
 
            return View(profile);
 
        }
        private bool IsFriend(string friendEmail)
        {
            var user = GetCurrentUser();
 
            return user != null && _touchWithFriendService.GetAllFriends(user.Id).Any(p => p.Email == friendEmail);
        }
 
        public ActionResult AddFriend(int id)
        {
            var user = GetCurrentUser();
 
            _touchWithFriendService.AddFriend(user.Id, id);
            GetDataAboutFriends(user.Id);
 
            return View("Index");
        }
 
        public ActionResult RemoveFriend(int id)
        {
            bool b = Request.IsAjaxRequest();
            var user = GetCurrentUser();
 
            _touchWithFriendService.RemoveFriend(user.Id, id);
            GetDataAboutFriends(user.Id);
 
            return View("Index");
        }
 
        private UserViewModel GetCurrentUser()
        {
            var email = User.Identity.Name;
 
            if (email == null)
                return null;
            else return _userService.GetUserByEmail(email).ToMvcUser();
        }
 
        private void GetDataAboutFriends(int id)
        {
            var friends = _touchWithFriendService.GetAllFriends(id).Select(u => u.ToMvcUser());
            var canAddFriends = _userService.GetAll().Select(u => u.ToMvcUser()).Except(friends, new UserViewModelComparer());
            
            ViewBag.UserFriends = friends;
            ViewBag.UserPotentialFriends = canAddFriends;
        }
    }

----------------------

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@using WEB.Models
@model UserViewModel
 
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_UserLayout.cshtml";
}
 
<div id="content">
<h2>Friends(@User.Identity.Name)</h2>
@helper ListFriends(IEnumerable<UserViewModel> friends, string nameForRadioButton)
{
foreach (var friend in friends)
    {
        if (friend.Email != User.Identity.Name)
        {
            <tr>
                <td>
                    @Html.ActionLink(friend.Email, "ShowFriend", routeValues: new { id = friend.Id })
                </td>
                <td>
                    @if (nameForRadioButton == "userFriends")
                    {
                        @Html.ActionLink("Remove from friends", "RemoveFriend", routeValues: new { id = friend.Id })
                        @*@Ajax.ActionLink("Remove from friends", "RemoveFriend", new { id = friend.Id }, new AjaxOptions { UpdateTargetId = "content"})*@
                    }
                    else
                    {
                        @Html.ActionLink("Add", "AddFriend", routeValues: new { id = friend.Id })
                        @*@Ajax.ActionLink("Add", "AddFriend", new { id = friend.Id }, new AjaxOptions { UpdateTargetId = "content" })*@
                    }
                </td>
            </tr>
        }
    }
}
 
 
    <table class="table">
        <tr>
            <th>
                <p>Friends email</p>
            </th>
            <th>
                <p>Operation</p>
            </th>
        </tr>
 
        @ListFriends(ViewBag.UserFriends, "userFriends")
 
        @ListFriends(ViewBag.UserPotentialFriends, "userPotentialFriends")
 
    </table>
</div>
Там, где 2 коммента это мои попытки использовать Ajax
0
Usaga
Эксперт .NET
5682 / 3916 / 701
Регистрация: 21.01.2016
Сообщений: 15,441
Завершенные тесты: 2
04.07.2016, 15:03 6
Лучший ответ Сообщение было отмечено kingass как решение

Решение

kingass, методы действия вызываемые AJAX-запросом возвращают полноценное представление return View("Index");, которое встраивается в блок content. Т.е. в ответ на AJAX-запрос приходит полноценная страница, которая встраивается в основную. Это трындец как не правильно. Используй PartialView.
1
kingass
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
04.07.2016, 16:19  [ТС] 7
Ура. УРА.УРА. Спасибо. Добавление пашет норм вроде. сейчас еще доправлю удаление и скину код готовый.

Добавлено через 12 минут
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using BLL.Interface.Services;
using System.Linq;
using System.Web.Mvc;
using WEB.Infrastructure;
using WEB.Models;
 
namespace WEB.Controllers
{
    [Authorize]
    public class FriendController : Controller
    {
        private readonly IUserService _userService;
        private readonly ITouchWithFriendService _touchWithFriendService;
        private readonly IProfileService _profileService;
 
        public FriendController(IUserService userService, ITouchWithFriendService touchWithFriendService,
            IProfileService profileService)
        {
            _userService = userService;
            _touchWithFriendService = touchWithFriendService;
            _profileService = profileService;
        }
 
        public ActionResult Index()
        {
            var user = GetCurrentUser();
 
            if (user == null)
                RedirectToAction("Index", "Home");
 
            GetDataAboutFriends(user.Id);
 
            if (Request.IsAjaxRequest())
            {
                return PartialView("_FriendsPartial");
            }
            else
            {
                return View();
            }
 
        }
 
        public ActionResult ShowFriend(string id)
        {
            if (string.IsNullOrEmpty(id))
                RedirectToAction("Index", "User");
 
            int userId;
            int.TryParse(id, out userId);
 
            UserViewModel userForShow = _userService.GetById(userId).ToMvcUser();
            ProfileViewModel profile = _profileService.GetById(userId).ToMvcProfile();
 
 
            if (IsFriend(userForShow.Email))
                ViewBag.IsFriend = true;
 
            ViewBag.User = userForShow;
            ViewBag.Path = profile.ImagePath;
 
            return View(profile);
 
        }
        private bool IsFriend(string friendEmail)
        {
            var user = GetCurrentUser();
 
            return user != null && _touchWithFriendService.GetAllFriends(user.Id).Any(p => p.Email == friendEmail);
        }
 
        public ActionResult AddFriend(int id)
        {
            var user = GetCurrentUser();
 
            _touchWithFriendService.AddFriend(user.Id, id);
            GetDataAboutFriends(user.Id);
 
            if (Request.IsAjaxRequest())
            {
                return PartialView("_FriendsPartial");
            }
 
            return View("Index");
        }
 
        public ActionResult RemoveFriend(int id)
        {
            bool b = Request.IsAjaxRequest();
            var user = GetCurrentUser();
 
            _touchWithFriendService.RemoveFriend(user.Id, id);
            GetDataAboutFriends(user.Id);
 
            if (Request.IsAjaxRequest())
            {
                return PartialView("_FriendsPartial");
            }
 
            return View("Index");
        }
 
        private UserViewModel GetCurrentUser()
        {
            var email = User.Identity.Name;
 
            if (email == null)
                return null;
            else return _userService.GetUserByEmail(email).ToMvcUser();
        }
 
        private void GetDataAboutFriends(int id)
        {
            var friends = _touchWithFriendService.GetAllFriends(id).Select(u => u.ToMvcUser());
            var canAddFriends = _userService.GetAll().Select(u => u.ToMvcUser()).Except(friends, new UserViewModelComparer());
            
            ViewBag.UserFriends = friends;
            ViewBag.UserPotentialFriends = canAddFriends;
        }
    }
}

Представление index.cshtml
C#
1
2
3
4
5
6
7
8
9
10
@using WEB.Models
@model UserViewModel
 
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_UserLayout.cshtml";
}
 
 
@Html.Partial("_FriendsPartial")
И частичное представление:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@using WEB.Models
@model UserViewModel
 
@*@{
    Layout = "~/Views/Shared/_UserLayout.cshtml";
}*@
 
 
<div id="content">
    <h2>Friends(@User.Identity.Name)</h2>
@helper ListFriends(IEnumerable<UserViewModel> friends, string nameForRadioButton)
{
    foreach (var friend in friends)
    {
        if (friend.Email != User.Identity.Name)
        {
            <tr>
                <td>
                    @Html.ActionLink(friend.Email, "ShowFriend", routeValues: new { id = friend.Id })
                </td>
                <td>
                    @if (nameForRadioButton == "userFriends")
                    {
                        @*@Html.ActionLink("Remove from friends", "RemoveFriend", routeValues: new { id = friend.Id })*@
                        @Ajax.ActionLink("Remove from friends", "RemoveFriend", new { id = friend.Id }, new AjaxOptions { UpdateTargetId = "content" })
                    }
                    else
                    {
                        @*@Html.ActionLink("Add", "AddFriend", routeValues: new { id = friend.Id })*@
                        @Ajax.ActionLink("Add", "AddFriend", new { id = friend.Id }, new AjaxOptions { UpdateTargetId = "content" })
                    }
                </td>
            </tr>
        }
    }
}
 
 
    <table class="table">
        <tr>
            <th>
                <p>Friends email</p>
            </th>
            <th>
                <p>Operation</p>
            </th>
        </tr>
 
        @ListFriends(ViewBag.UserFriends, "userFriends")
 
        @ListFriends(ViewBag.UserPotentialFriends, "userPotentialFriends")
 
    </table>
</div>
0
Nelo_001
4 / 6 / 6
Регистрация: 31.10.2013
Сообщений: 201
07.07.2016, 12:43 8
0
07.07.2016, 12:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2016, 12:43

Ajax.ActionLink не принимает в div частичное представление от контроллера
Вот кусок представления: &lt;p&gt; @Ajax.ActionLink(&quot;Создать&quot;, &quot;Create&quot;, new AjaxOptions {...

Нажатие на ссылку созданную Ajax.ActionLink() вызывает множество запросов
Пишу форму по заполнению медицинского осмотра. Для заполнения поля с Id пациента есть ссылка на...

Почему AuthorizeAttribute каждый раз вызывается дважды?
Привет! Есть свой класс, унаследованный от AuthorizeAttribute, в котором переопределен метод...


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

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

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