【问题标题】:@Html.ActionLink and Angularjs value?@Html.ActionLink 和 Angularjs 的价值?
【发布时间】:2014-09-30 17:07:21
【问题描述】:

嘿,我目前正在从事一个已经实现 angularjs 的项目,我想知道是否有办法在 Html Helper 中使用 angular 值?

这是我无法工作的地方:

@Html.ActionLink("Edit", "Edit", new { id = {{row.Id}} })

你如何使用剃刀语法中的值?

【问题讨论】:

    标签: html asp.net-mvc angularjs razor razorengine


    【解决方案1】:

    此处提供的其中一些答案可能在 2014 年有效,但随着 MVC 的较新版本,截至 2017 年,路由无法按预期工作,或者您可能正在使用[RoutingAttrbiutes],它允许您轻松调整路由名称和参数.

    基于这里的所有这些答案,ShaqCodeByteBlocks 我构建了一个 UrlHelper 扩展,帮助我们现在让我们的生活更轻松一些。

    如果你将它包含在全局命名空间中,你不需要导入任何东西,你可以按如下方式使用它'

    <a ng-href="@Url.AngularActionLink("create", "purchaseorder", "supplierId", "{{supplier.Id}}")">Create</a>
    

    而扩展类如下

    public static class AngularUrlHelper
    {
        public static List<string> RawRouteUrl;
    
        public static string AngularActionLink(this UrlHelper html, string actionName, string controller, string routeValue, string angularBinder)
        {
            var actionUrl = string.Empty;
    
            if (RawRouteUrl == null)
                RawRouteUrl = new List<string>();
    
            var routeQuery = $"{actionName}/{{{routeValue}}}";
    
            var rawRoute = RawRouteUrl.FirstOrDefault(x => x.Contains(routeQuery));
    
            if (string.IsNullOrWhiteSpace(rawRoute))
            {
            RawRouteUrl.Clear();
    
                foreach (var r in RouteTable.Routes)
                {
                    try
                    {
                        RawRouteUrl.Add(((Route)r).Url);
                    }
                    catch (System.Exception) { }
                }
    
                rawRoute = RawRouteUrl.FirstOrDefault(x => x.Contains(routeQuery));
            }
    
            if (!string.IsNullOrWhiteSpace(rawRoute))
            {
                actionUrl = rawRoute.Replace($"{{{routeValue}}}", angularBinder);
            }
    
            return actionUrl;
        }
    }
    

    结果 HTML 将是 Angular 就绪的。

    <a ng-href="/create/purchaseorder/{{supplier.Id}}">Create</a>
    

    更多信息。

    我使用静态列表为每个应用程序池创建了一个非常简单的缓存系统。除非您发布,否则 URL 不会真正改变,但如果您直接在服务器上编辑 .chstml 文件,它们可能会改变。

    所以为了适应缓存刷新,如果没有找到预期的 url 查询,它将尝试重建路由字符串列表。

    我做这个缓存的原因是为了避免在RouteTable.Routes 上不断迭代——我试图找到一种方法来轻松地从RouteCollection 获取字符串 URL 值——但由于某种原因,这实际上是不可能的! ?所以因此..这个扩展。

    【讨论】:

      【解决方案2】:

      你可以使用ng-hrefUrl.Content如下

      <a ng-href="@Url.Content("~/Home/Edit/"){{row.Id}}">Edit</a>
      

      【讨论】:

        【解决方案3】:

        使用ActionLink的问题是这个方法在创建URL的时候会调用UrlPathEncode。这意味着剃须刀指令{{}} 带有获取编码。 Angular 将无法评估它。您需要做的是单独创建此 URL,然后对其进行解码。例如,我在我们项目的一个页面中有类似的内容。

        @{
        var url = Url.Action("Index", "Home", new{id="{{id=lastLatency}}"});
        url = HttpUtility.UrlDecode(url);
        }
        
        <a data-ng-href="@url">Home</a>
        

        使用ng-href 属性设置URL 非常重要。

        【讨论】:

        • 非常感谢!现在我又近了一步。 URL 正在使用参数更新,但不会触发站点。
        • 这对我很有帮助。我的要求有点不同,我需要路由到特定页面。所以我用var url = Url.Action("Index","OtherPlace");&lt;a ng-href="@(url)#/routePage/{{vm.param1}}"&gt;someText&lt;/a&gt;
        • @ByteBlocks 有没有办法将此应用于按钮元素?
        • 这不适用于路由属性。因此,如果我放置一个属性并将其定义为 int.. 那么提供一个字符串不会带回任何 url。有人决定使用路由属性有点烦人......但是是的。只是如果其他人遇到这个问题
        • 我已经根据这里的所有答案编写了一个快速扩展。我喜欢你的想法,但我不喜欢在视图上混合代码。因此,在Url.Helper 之后,我创建了一个适用于路由字符串的扩展。它是基本的,但效果很好,并且遵循 Razor 风格。
        【解决方案4】:

        我找到了简单的解决方案!

        <a data-ng-href="@Url.Action("Edit", "Home")/{{row.Id}}" target="_self">Edit  </a>
        

        但感谢您的回复,它让我走上了成功之路!

        【讨论】:

        • 这个问题是,如果“编辑”是您对路由的默认操作,它将创建一个缩短的 URL,如“Home/{{rowId}}”。
        • -1 - Razor 找不到正确的路线,因为您需要在帮助程序期间提供路线值。所以我得到的只是/9 - 其中9是我试图传递的ID。而不是/home/edit/9
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        相关资源
        最近更新 更多