【发布时间】:2015-04-11 21:49:18
【问题描述】:
如何创建将调用动态局部视图的动态 ajax.actionlinks。
例如:
- 我有一个页面会生成 x 个 cmets
- 每条评论都可以投票赞成或反对(单独)
- 赞成票和反对票的数量计入一个整数
- 每个评论 div 都有自己的 ajax.actionlink
- 每个 ajax.actionlink 都会将评论的 ID 传递给控制器
- 控制器将计算总票数并调用局部视图以显示回具有正确 ID 的 div。
到目前为止我做了什么:
我已经能够成功创建ajax.actionlink
这将调用控制器并对投票进行汇总
这将调用局部视图并显示投票
有什么问题
- 我不想硬编码 30-100 个不同的 ajax.actionlink 来调用 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 在同一个 razor 视图中显示部分视图的返回结果。
<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 显示循环中的 cmets。
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 调用就好了,但我需要动态显示单独 div 的单独 ajax 调用。
【问题讨论】:
-
容器(带 ID 的 div)是局部视图的一部分?我不确定我是否理解这个问题(可能包括示例代码?)
-
没有。因此,Ajax.Action 链接将调用一个 Action,该 Action 作为回报将调用将填充 div 的局部视图。问题是根据需要多少动态创建 div 和部分视图。稍后我会发布一些示例代码。
-
你的 Ajax Helpers 已经超过了。你真的想要一个像 AngularJS 或 EmberJS 这样的 Javascript MVC 语言。使用健壮的模板化框架,您的视图数据可以耦合到 JS 变量。因此,对端点注册投票的相同调用也可以返回投票计数。一旦你更新了你的 vote-count JS 变量,你的 View 就可以在没有 DOM 操作或加载的情况下反映新的数据。
-
您有示例链接吗?
-
如果你已经在视图中渲染了cmets,为什么还要调用一个方法来再次返回视图。只需给每个“投票按钮”一个类名并将关联的评论 ID 存储在
data-属性中,然后处理.click()事件并使用 ajax 将 ID 传递给方法并在成功函数中更新关联的投票计算 DOM 中的值。
标签: asp.net-mvc-4