Как создать динамические ajax.actionlinks, которые будут вызывать динамические частичные представления.
Например:
- У меня есть страница, которая будет генерировать x количество комментариев
- Каждый комментарий может быть проголосован вверх или вниз (индивидуально)
- Количество голосов и вниз голосов подсчитывается в одно целое
- Каждый комментарий div будет иметь свою собственную ajax.actionlink
- Каждая ajax.actionlink передает контроллеру идентификатор комментария
- Контроллер рассчитает общее количество голосов и вызовет частичное представление для отображения обратно в 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 внутри того же вида бритвы, чтобы отобразить возвращаемые результаты из частичного представления.
<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-вызова просто отлично, но мне нужно отображать отдельные вызовы ajax для отдельных divs динамически.