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

时间:2016-09-01 02:28:52

标签: javascript c# asp.net asp.net-mvc

我正在尝试使用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方法。我不确定我是否以正确的方式完成了参数的传递。如果有人帮忙,我会很感激。

1 个答案:

答案 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){});