在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方法。我不确定是否以正确的方式传递了参数。如果有人能帮忙的话,我将不胜感激。

在ASP中使用HtmlHelper构造URL.净MVC

当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