在ASP中使用HtmlHelper构造URL.净MVC
本文关键字:构造 URL MVC HtmlHelper ASP | 更新日期: 2023-09-27 18:04:56
我正在尝试使用HTML helper扩展方法构建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方法。我不确定是否以正确的方式传递了参数。如果有人能帮忙的话,我将不胜感激。
当razor试图渲染视图时,您的c#代码(调用GenerateActionLink helper方法)将在服务器中执行。那时js变量值将不存在。razor执行所有c#代码视图文件的输出只是浏览器将呈现的html标记。只有在这之后,你的javascript才会被执行,js变量值才会可用。
如果你绝对需要在你的客户端javascript代码中使用UrlHelper方法生成动态url(为每个id/logicstatusId值),你可以考虑通过一个action方法来暴露c#代码。当你在javascript代码中需要链接url时,对action方法进行ajax调用,传递参数值并获取url。
public string GenerateActionLink(string id, int logicstatusId)
{
var actionName = "Advanced";
var controllerName = "HighAdvanced";
if (logicstatusId == 5)
{
actionName = "Basic";
controllerName = "HighBasic";
}
var targetUrl = UrlHelper.GenerateUrl("Default", actionName, controllerName, new RouteValueDictionary(new { id = id }), RouteTable.Routes, Request.RequestContext, false);
return targetUrl;
}
在客户端
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);
});
但是如果你想为很多项目这样做,你可能不想对每个项目进行调用,在这种情况下,我将生成基本链接并有条件地附加javascript中的querystring值
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