我正在尝试使用HTML帮助程序扩展方法构建URL,同时尝试将参数传递给扩展方法。例如
public static MvcHtmlString GenerateActionLink(this HtmlHelper html,string displayText,string id,int logicstatusId)
{
var actionName = string.Empty;
var controllerName = string.Empty;
if (logicstatusid == 5)
{
actionName = "Basic";
controllerName = "HighBasic";
}
else
{
action = "Advanced";
controllerName = "HighAdvanced";
}
var targetURL = UrlHelper.GenerateUrl("Default", action, controller, new RouteValueDictionary(new { id = id}), RouteTable.Routes, html.ViewContext.RequestContext, false);
//Create the hyper link tag
var anchorLinkBuilder = new TagBuilder("a");
//Merge the target URL with the href attribute
anchorLinkBuilder.MergeAttribute("href", targetURL);
return MvcHtmlString.Create(anchorLinkBuilder.ToString(TagRenderMode.Normal));
}
虽然这个帮助方法正在运行,但我面临的问题是在客户端。
var cellHtml = '<div class="action-column">';
var id= row.encryptedId;
cellHtml += '@Html.GenerateHtmlLink("Blip","'+ id+'" , 4)';
cellHtml += "</div>";
return cellHtml;
在这种情况下,URL正在构造,但id参数未传递给helper方法。我不确定我是否以正确的方式完成了参数的传递。如果有人帮忙,我会很感激。
答案 0 :(得分:2)
当razor尝试渲染视图时,您的C#代码(调用GenerateActionLink帮助器方法)在服务器中执行。那时js变量值不会出现。执行所有C#代码视图文件的剃刀输出只是浏览器将呈现的html标记。只有在那之后你的javascript才会执行,并且js变量值将是可用的。
如果您绝对需要使用UrlHelper方法在客户端javascript代码中生成动态URL(对于每个id / logicstatusId值),您可以考虑通过操作方法公开该C#代码。每当您需要javascript代码中的链接网址时,请对操作方法进行ajax调用,传递参数值并获取网址。
var id = 1;
$.get('/Home/GenerateActionLink?logicstatusId=5&id=' + id,function(res) {
var htmlMarkup = '<a href="' + res + '">Blip</a>';
// do something with htmlMarkup
// Ex : $('#SomeDivId').append(htmlMarkup);
});
在客户端
var baseUrlBasic = "@Url.Action("Basic","HighBasic");
// Now later
var id = 1;
var newUrl = baseUrl+'?logicstatusId=5&id='+id;
// Use this to build the anchor tag
但是如果你想为很多项目执行此操作,你可能不想为每个项目调用,在这种情况下,我会生成基本链接并有条件地在javascript中附加查询字符串值
request('https://xxxxx/api?param={"title": "你好", "number": "8"}',
function(error, response, body){});