@Html.ActionLink和Angularjs值?
嘿,我目前正在从事一个已经实现angularjs的项目,我想知道是否有办法在Html帮助程序中使用角度值 这就是我无法工作的地方:@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,然后解码它。
@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