我有一个简单的foreach
模板,在每个我需要ActionLink的元素中,但ActionLink需要发送一个Id来编辑元素。
要模板化的项目:
<div data-bind="template: {
name: 'postsTemplate',
foreach: posts
}">
</div>
模板:
<script id="postsTemplate" type="text/html">
<h2 data-bind="text: Title"></h2>
<p class="post-info">
<p class="post-info" data-bind="text UserName"></p>
<span data-bind="Body"></span>
<p class="post-footer">
@Html.ActionLink("Comments", "IndividualPost", "Post", null, null, "comments", new {id = })
</p>
</p>
</script>
如何通过ActionLink发送实际帖子Id
?我的意思是,如何在不使用数据绑定的情况下访问帖子的ID? (因为它是帮助者)。
答案 0 :(得分:5)
如果您要沿着以下行实现自己的ActionLink扩展:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText,
string actionName, string controllerName,
object routeValues, bool noEncode)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action(actionName, controllerName, routeValues);
if (noEncode) url = Uri.UnescapeDataString(url);
var tagBuilder = new TagBuilder("a");
tagBuilder.MergeAttribute("href", url);
tagBuilder.InnerHtml = linkText;
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
然后你可以制作你的模板:
<p class="post-info">
<p class="post-info" data-bind="text UserName"></p>
<span data-bind="Body"></span>
<p class="post-footer">
@Html.ActionLink("Comments (${CommentCount})", "IndividualPost", "Post",
new {id = "${id}"}, true)
</p>
</p>
生成的服务器端html将如下所示:
<p class="post-info">
<p class="post-info" data-bind="text UserName"></p>
<span data-bind="Body"></span>
<p class="post-footer">
<a href="/Post/IndividualPost/${id}">Comments (${CommentCount})</a>
</p>
</p>
在我看来这是一个完美的模板。
ActionLink扩展的原因是普通的Html.ActionLink将您的网址编码为/Post/IndividualPost/%24%7Bid%7D
,但这不适用于模板
答案 1 :(得分:1)
选项1: - 你的帖子viewmodel可能来自服务器,它可能包含链接。
{
title:'post title',
commentsUrl:'/Indivdualpost/comments/123'
}
在服务器上
return new post { comment='post title', commentsUrl=Url.Action('Comments','Individualposts', new {id=1234}); }
然后在模板中呈现评论网址:
<a data-bind="attr: {href:commentsUrl}">comments</a>
选项2: 使用表单的脚本
<form id="frm" action="@Url.Action("Comments","IndividualPost")>
<input type="hidden" name="id" id="postid"/>
<!-- template stuff -->
</form>
并在模板中
<p class="post-footer">
<a data-bind="click:function(){ $('#postid').val(${$id}); $('#frm').submit(); }">comments</a>
</p>
(click属性非常难看,应该使用绑定处理程序或viewmodel函数(http://www.knockmeout.net/2011/08/simplifying-and-cleaning-up-views-in.html)进行改进)