【问题标题】:Razor MVC4 Url.Action not workingRazor MVC4 Url.Action 不起作用
【发布时间】:2013-11-25 22:41:56
【问题描述】:

我在剃刀视图中有如下代码

<a href="@Url.Action("Details", "Mycontr", new {id =16}, Request.Url.Scheme)">

当我双击这个项目时,它被重定向到下面的 Url

http://localhost:49280/Mycontr/Section/@Url.Action(

但预期是

http://localhost:49280/Mycontr/Details/16

下面是路由配置

routes.MapRoute(
   name: "Capsule",
   url: "Mycontr/Details/{id}",
   defaults: new { controller = "Mycontr", action = "Details", id = UrlParameter.Optional }
 );
 routes.MapRoute(
   name: "Section",
   url: "Mycontr/Section/{id}",
   defaults: new { controller = "Mycontr", action = "Section", id = UrlParameter.Optional }
 );

请推荐。

我缩小了问题的范围。 Html.Raw 导致问题。我有类似的代码

@Html.Raw(HttpUtility.HtmlDecode(Model.sContent)) 

该变量包含生成的具有 Ur.Action 的 html。如果我只是将 html 生成的代码直接放在没有 Html.Raw 的 razor 视图中,它工作正常。但是,如果我取出 Html.Raw 运行时生成的 html 脚本,它会显示为

&lt;style type=&#39;text/css&#39;&gt;&lt;/style&gt;&lt;center&gt;&lt;div style=&quot;width:460px;&quot;&gt;&lt;div style=&quot;width: 460px; float: left;&quot;&gt;&lt;div s...

有没有一种方法可以在不使用 Html.Raw 编码的情况下在变量中显示 html 脚本? 通过使用 HtmlString 代替字符串变量来保存生成的 Html 脚本,解决了一半的问题,但是 HtmlString 无法解码字符串中的 @Url.Action 语法。

下面是我一直在努力让它工作的最新代码。请帮忙。

                string templFile = string.Format("{0}\\DivTemplate.htm", path);
            HtmlDocument divDoc = new HtmlDocument();
            StreamReader sRdr = new StreamReader(templFile, Encoding.UTF8);
            divDoc.Load(sRdr);
            XmlNodeList divs = regions.ChildNodes;
            IEnumerator enmrDivs  = divs.GetEnumerator();
            while (enmrDivs.MoveNext())
            {
                XmlNode node = (XmlNode)enmrDivs.Current;
                string divId = node["DivId"].InnerText;
                string capId = node["CapsuleId"].InnerText;
                HtmlString sUrlAct = new HtmlString("@Url.Action(\"Capsule\", \"Publication\", new { id=\""+capId+"\" }))");
                //string sUrlAct = "@Url.Action(\"Capsule\", \"Publication\", new { id=\""+capId+"\"})";
                string divFile = string.Format("{0}\\{1}.htm", path, divId);

                HtmlDocument divRgnDoc = new HtmlDocument();
                StreamReader sR = new StreamReader(divFile, Encoding.UTF8);
                divRgnDoc.Load(sR);
                foreach (HtmlNode link in divRgnDoc.DocumentNode.SelectNodes("//a[@href]"))
                {
                    link.Attributes.RemoveAll();
                    link.Attributes.Add("href", sUrlAct.ToString());
                }
                HtmlNode divNode = divDoc.GetElementbyId(divId);
                divNode.AppendChild(divRgnDoc.DocumentNode.FirstChild.CloneNode(true));
                sR.Close();
            }

            sContent = new HtmlString (divDoc.DocumentNode.InnerHtml);
            sRdr.Close();

【问题讨论】:

  • 有什么理由不使用 Html.ActionLink 助手?
  • 您可以尝试将双引号替换为单引号。也许 html 和 C# 代码中的双引号会混淆渲染引擎(Razor)。
  • 你有结束标签吗?一个您发布包含 的视图代码
  • @Floremin 是的,有理由不使用 ActionLink,因为它会生成我想在我的代码中避免的 标签,因为在我的代码中已经有 标签跟进内容并以 标记结尾。我使用 AgilityPack 进行 html 解析,当我通过它的使用指定任何属性值时,它为每个值添加双引号,不确定是否有办法让解析器避免向属性值添加引号
  • @Dima 是的,有一个结束 标记。我的格式是 一些其他内容

标签: asp.net-mvc razor asp.net-mvc-routing url.action


【解决方案1】:

我知道它有点晚了,但我在搜索某些东西时遇到了这篇文章。

您的代码中的问题在于您的锚标记和双引号。

<a href="@Url.Action("Details", "Mycontr", new {id =16}, Request.Url.Scheme)">

您在技术上告诉解析器您正在引用 "URL"(双引号)之间的超链接,这意味着 href 是 @Url.Action(。你可以这样做这种方式(使用单引号来分配你的href)并希望有效

<a href='@Url.Action("Details", "Mycontr", new {id =16}, Request.Url.Scheme)'>

现在你的 href 将是 @Url.Action("Details", "Mycontr", new {id =16}, Request.Url.Scheme)

【讨论】:

  • 没错,双引号内的双引号会误导 javascript
  • 阅读起来可能有点混乱,但在这里使用所有双引号就可以了。 @ 提示 razor 切换到 c# 模式,并且它一直处于 c# 模式,直到结束圆括号。内部的双引号都会被解析为c#,返回浏览器时只有一对双引号,包含一个URL。
【解决方案2】:

我已经解决了这个问题。我真的不需要@Url.Action 到href。我刚刚将代码替换为逻辑路径,如下所示

/Publication/Capsule/ + capId

this link 帮我解决了这个问题。感谢 Jorge 节省了工作时间 :)

【讨论】:

  • 如果您的站点不在根级别怎么办?例如,如果站点位于 /some/folder/Home/Index,则指向 /Publication/Capsule/4 的链接不会指向您的站点。
  • 我看到它触发了正确的Action方法(Capsule)。配置上述链接的剃须刀视图页面(.cshtml)不在根目录下。该操作被正确调用,因为我在 RouteConfig 中进行了配置。
  • @Kobi,你是对的,但是在我的情况下,内容在同一台服务器中,因此上述解决方案有效。
  • 同意这不是问题的答案。欢迎投反对票。
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 2021-08-19
  • 2014-04-19
  • 1970-01-01
  • 2017-09-20
  • 2014-09-03
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多