@Html.ActionLink和Angularjs值?

@Html.ActionLink和Angularjs值?,html,asp.net-mvc,angularjs,razor,razorengine,Html,Asp.net Mvc,Angularjs,Razor,Razorengine,嘿,我目前正在从事一个已经实现angularjs的项目,我想知道是否有办法在Html帮助程序中使用角度值 这就是我无法工作的地方: @Html.ActionLink("Edit", "Edit", new { id = {{row.Id}} }) 如何在razor语法中使用该值?使用ActionLink的问题是,该方法在创建URL时调用urlpathcode。这意味着razor指令{{}}带有get encoded。Angular将无法对其进行评估。你需要做的是分别创建这个URL,然后解码它。

嘿,我目前正在从事一个已经实现angularjs的项目,我想知道是否有办法在Html帮助程序中使用角度值

这就是我无法工作的地方:

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

如何在razor语法中使用该值?

使用
ActionLink
的问题是,该方法在创建URL时调用
urlpathcode
。这意味着razor指令
{{}}
带有get encoded。Angular将无法对其进行评估。你需要做的是分别创建这个URL,然后解码它。例如,我在我们项目的一个页面中有类似的内容

@{
var url = Url.Action("Index", "Home", new{id="{{id=lastLatency}}"});
url = HttpUtility.UrlDecode(url);
}

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

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

我找到了简单的解决方案

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


但是谢谢你的回应,它让我在通往成功的道路上走了一段路

您可以使用
ng href
Url.Content
如下

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

此处提供的一些答案可能在2014年起作用,但随着MVC的更新版本,截至2017年,路线无法按预期工作,或者您可能正在使用
[RoutingAttrButes]
,这使您可以轻松调整路线名称和参数

基于所有这些答案,
ShaqCode
ByteBlocks
我构建了一个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;
    }
}
公共静态类AngularUrlHelper
{
公共静态列表RawRouteUrl;
公共静态字符串AngularActionLink(此UrlHelper html、字符串actionName、字符串控制器、字符串routeValue、字符串angularBinder)
{
var actionUrl=string.Empty;
if(RawRouteUrl==null)
RawRouteUrl=新列表();
var routeQuery=$“{actionName}/{{{{routeValue}}}”;
var rawRoute=RawRouteUrl.FirstOrDefault(x=>x.Contains(routeQuery));
if(string.IsNullOrWhiteSpace(rawRoute))
{
RawRouteUrl.Clear();
foreach(RouteTable.Routes中的var)
{
尝试
{
RawRouteUrl.Add(((Route)r.Url);
}
catch(System.Exception){}
}
rawRoute=RawRouteUrl.FirstOrDefault(x=>x.Contains(routeQuery));
}
如果(!string.IsNullOrWhiteSpace(rawRoute))
{
actionUrl=rawRoute.Replace($“{{{{routeValue}}}}”,angularBinder);
}
返回actionUrl;
}
}
结果HTML将准备就绪

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


更多信息

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

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


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

非常感谢!现在我更接近了。URL正在用参数更新,但它不会触发站点。这对我很有帮助。我的要求有点不同,我需要路由到一个特定的页面。所以我使用了
var url=url.Action(“Index”,“OtherPlace”)
@ByteBlocks是否有方法将其应用于按钮元素?这不适用于路由属性。因此,如果我放置一个属性并将其定义为int。。然后,提供字符串不会返回任何url。有人决定使用路由属性,这有点烦人。。。但是是的。如果有人遇到这个问题,我已经根据这里的所有答案写了一个快速扩展。我喜欢你的想法,但我不喜欢在视图上混合代码。因此,遵循
Url.Helper
我创建了一个扩展,它可以处理路由中的字符串。它是基本的,但它工作得很好,并且遵循Razor样式。问题是,如果“编辑”是您对路由的默认操作,它将创建一个缩短的Url,如“Home/{{rowId}}”。-1-Razor找不到正确的路由,因为您需要在帮助程序中提供路由值。所以我得到的是
/9
——其中9是我试图传递的ID。而不是
/home/edit/9