我正在研究一个使用jsrender的MVC项目。 这是我第一次和jsrender一起工作(事实上我在javascript和C#上都相当陌生)而且我现在一直在为一个特定的问题苦苦挣扎。
我有以下javascript
$.post('@Url.Action("GetDocs","Place", new { placeID = Model.PlaceId})').done(
function (data) {
var template = $.templates("#doc-tmpl");
var htmlOut = template.render(data.documents);
$("#documentListContainer").append(htmlOut);
$(".docCount").html(data.count);
});
这将获取下面模板所需的所有数据,但我需要使用一段数据创建一个Url.Action()。
<script id="doc-tmpl" type="text/x-jsrender">
<div class="col-md-4">
<h5>{{:Name}}{{:test}}</h5>
<p id="DocId" class="hidden"><br />{{:DocId}}</p>
<img src="data:image;base64,{{:FrontCoverImg}}" width="140" height="230" />
<a href="@Url.Action("DisplayPDF","Place", new { DocId = "{{:DocId}}" })">Link</a>
</div>
我需要从@Url.Action("DisplayPDF","Place", new { docId = "{{:docId}}" })
的routeValues中的数据提供docId。
显然,这不符合目前的状态。
我查看了jsrender文档以及与jsrender和MVC有关的其他Q&amp; A,但是我无法绕过它的工作方式。
我想到的一件事是在javascript中创建@ Url.Action()并使用标签在模板中弹出它,但是我无法弄清楚如何从中添加数据$ .post为了使标签可用。
修改 我的意思是上面的段落,javascript / getDocs帖子返回的数据是这样的:
documents": [
{
"DocId": "86f86a32-5005-456c-8dd1-c023a66dd794",
"Name": "How to...",
"FrontCoverImg": "Base64String(docImg)"
},
{
"DocId": "d29f8afc-3191-47f1-9b88-1de08582ba27",
"Name": "A Document",
"FrontCoverImg": "Base64String(docImg)"
}
],
"count": 2
}
然后将其设置为填写模板。我希望有一种方法可以将@ Url.Action()语句添加到这些键/值对中,例如:
"viewdoc" : '@@Url.Action("DisplayPDF", "Place", new {DocId = ' + DocId + ', @@class = "btn btn-default" })';
(不确定语法是否正确)所以我可以将{{:viewdoc}}
放入模板中。
我至少走在正确的轨道上吗?洛尔
答案 0 :(得分:0)
试试这个,
var id = $('#docId').val();
var link = '@URL.Action("download file", "download", new { id = "-1" })';
link = link.replace("-1", id);
答案 1 :(得分:0)
好的,所以在离开一个星期然后进行了大量的实验和谷歌搜索后,我找到了解决方案。
我已在控制器中创建了链接,其中设置了JSON数据。 我不得不请求URL的最左边部分并硬编码url的控制器/动作部分,否则它会在当前页面url的末尾塞入新url。 所以解决方案如下:
控制器:
foreach (Doc document in docs)
{
DocJson dj = new DocJson();
dj.DocId = document.DocId;
dj.Name = document.Comments;
//get base Url
var request = HttpContext.Request.Url.GetLeftPart(UriPartial.Authority);
dj.docLink = request + "/Place/DisplayPDF?DocId=" + document.DocId;
//get image bytes
var docImg = document.FrontCoverImg;
dj.FrontCoverImg = Convert.ToBase64String(docImg);
documents.Add(dj);
}
return Json(new { documents = documents, count = documents.Count() }, JsonRequestBehavior.AllowGet);
(在视图中) 获取数据的Javascript:
//getDocs
$.post('@Url.Action("GetDocs","Place", new { placeID = Model.PlaceId})').done(
function (data) {
console.log(data);
var template = $.templates("#doc-tmpl");
var htmlOut = template.render(data.documents);
$("#documentListContainer").append(htmlOut);
$(".docCount").html(data.count);
});
(在视图中) 模板本身:
@* Document jsrender template *@
<script id="doc-tmpl" type="text/x-jsrender">
<div class="col-md-4">
<a href="{{:docLink}}" target="_blank">
<h5>{{:Name}}</h5>
<p id="DocId" class="hidden"><br />{{:DocId}}</p>
<img src="data:image;base64,{{:FrontCoverImg}}" width="140" height="230" />
</a>
</div>
</script>