Как создать динамические ajax.actionlinks, которые будут вызывать динамические частичные представления.MVC Ajax с созданием динамического частичного представления
Например:
- У меня есть страница, которая будет генерировать й количество комментариев
- Каждого комментарий может быть проголосовавшими вверх или вниз (по отдельности)
- числа до голосов и вниз голоса пересчитываются в одно целое
- Каждый комментарий div будет иметь свою собственную ajax.actionlink
- Каждая строка ajax.action будет передана контроллеру ID комментария
- Контроллер рассчитывает общее количество голосов и вызывает частичное представление для отображения обратно в div с правильным идентификатором.
Что я сделал до сих пор:
Я был в состоянии создать успешный Ajax.ActionLink
Это будет вызывать контроллер и просуммировать голосов
Это будет называть частичный просмотр и отображать голоса
чем проблема
- Я не хочу много кода 30-100 различных ajax.actionlinks на призыв 30-100 жестко закодированные частичный вид.
Как я могу выполнить это динамически?
Существующий код:
Мой Ajax.ActionLink внутри мой взгляд бритвы
@Html.Raw(Ajax.ActionLink("[replacetext]", "VoteUp",
new { UserPostID = @Model.Id },
new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "CountVote" }).ToHtmlString().Replace("[replacetext]",
"<img src=\"/Images/up_32x32.png\" />"))
Мой ДИВ внутри одной и той же точки зрения бритвы, чтобы отобразить возвращающимся результаты частичного вида.
<div id="CountVote" class="postvotes"></div>
Мой контроллер
public PartialViewResult VoteUp(int UserPostID)
{
try
{
UserVotes vote = new UserVotes();
vote.SubmitedVote = 1;
vote.UserId = Convert.ToInt32(Session["id"]);
vote.UserPostID = UserPostID;
ViewBag.SumVotes = postRepository.InsertUserPostVote(vote);
}
catch (Exception e)
{
xxx.xxx.xxxx().Raise(e);
}
return PartialView("_TotalVotes");
}
И, наконец, мое частичное (_TotalVotes.cshtml)
@ViewBag.SumVotes
Сейчас мой основной вид для Viewpost показывает комментарии в цикле, используя viewbag.
foreach (var item in (List<UserComment>)ViewData["Comments"])
{
CommentVote = "cv" + i.ToString();
<div class="postlinewrapper">
<div class="postvotesframe">
<div class="postvotes">
@Html.Raw(Ajax.ActionLink("[replacetext]", "VoteUp",
new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "CountVote" }).ToHtmlString().Replace("[replacetext]",
"<img src=\"/Images/up_32x32.png\" />"))
</div>
<div id="@CommentVote" class="@CommentVote">0</div>
<div class="postvotes">
@Html.Raw(Ajax.ActionLink("[replacetext]", "VoteDown",
new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "CountVote" }).ToHtmlString().Replace("[replacetext]",
"<img src=\"/Images/down_32x32.png\" />"))
</div>
</div>
<div class="postleftbar">
@Html.Raw(item.Comment)
</div>
<div class="postrightbar">
<div>
<div class="post_spec">
<div class="post_spec_title">Call Sign: </div>
<div class="post_spec_detail">@item.CallSign</div>
</div>
<div class="post_spec">
<div class="post_spec_title">When: </div>
<div class="post_spec_detail">@item.CommentDate.ToString("dd/MM/yyyy")</div>
</div>
</div>
<br />
<br />
</div>
</div>
i += 1;
}
Я осуществил логин, чтобы увеличить или уменьшить количество голосов вверх и вниз:
public PartialViewResult VoteUp(int userPostId)
{
try
{
UserVotes vote = new UserVotes();
vote.SubmitedVote = 1;
vote.UserId = Convert.ToInt32(Session["id"]);
vote.UserPostID = userPostId;
ViewBag.SumVotes = postRepository.InsertUserPostVote(vote);
}
catch (Exception e)
{
xxxx.xxxx.xxxx().Raise(e);
}
return PartialView("_TotalVotes");
}
public PartialViewResult VoteDown(int userPostId)
{
try
{
UserVotes vote = new UserVotes();
vote.SubmitedVote = -1;
vote.UserId = Convert.ToInt32(Session["id"]);
vote.UserPostID = userPostId;
ViewBag.SumVotes = postRepository.InsertUserPostVote(vote);
}
catch (Exception e)
{
xxx.xxxx.xxxx().Raise(e);
}
return PartialView("_TotalVotes");
}
Теперь все этот код работает 1 Ajax вызова просто прекрасно, но то, что мне нужно, чтобы отобразить отдельный Аякса вызовы для отдельных divs динамически.
Контейнера (Div с идентификатором) является частью частичного вида? Я не уверен, что я понимаю вопрос (может быть, примерный код?) –
Нет. Таким образом, ссылка Ajax.Action вызовет действие, которое в ответ вызовет частичное представление, которое будет заполнять div. Проблема заключается в создании divs и частичных представлений «на лету» на основе того, сколько из них необходимо. Я напишу позже пример кода. –
Вы перерастаете помощников Ajax. Вам действительно нужен Javascript MVC-язык, такой как AngularJS или EmberJS. Благодаря надежной шаблонной структуре ваши данные могут быть связаны с переменными JS. Таким образом, тот же призыв к конечной точке для регистрации голосования может также вернуть подсчет голосов. После того, как вы обновите переменные JS для подсчета голосов, ваш вид может отражать новые данные без манипуляций DOM или загрузки. –