2013-03-15 89 views
7

我有一个代码,如下面的Razor视图剃刀MVC4 Url.Action不工作

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

而我双击这个项目就被重定向到以下网址

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

但是,尽管预期是

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

下面是RouteConfig

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,它就可以正常工作。但是,如果我拿出Html.Raw所显示的一样

&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脚本有没有办法,我可以显示在可变HTML脚本,而不使用Html.Raw编码的方法吗? 通过使用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(); 
+2

任何不使用Html.ActionLink助手的理由? – Floremin 2013-03-16 05:09:16

+0

你可以尝试用href替换单引号。在HTML和C#代码中使用双引号可能会令渲染引擎(Razor)混淆。 – Floremin 2013-03-16 05:21:36

+0

你有结尾标记吗?一个您发布它包装 Dima 2013-03-16 07:13:29

回答

10

我知道它迟了一点,但当我寻找某些东西时,我遇到了这篇文章。

这里在你的代码问题是你的锚标记和双引号。

<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( “详细信息”, “Mycontr”,新{ID = 16},Request.Url.Scheme)

+0

这就是双引号内的双引号是误导性的JavaScript – Naga 2014-08-02 14:32:57

-4

我已经解决了这个问题。我真的不需要@Hell.Action到href。我刚更换过的代码逻辑路径如下

/Publication/Capsule/ + capId 

this link帮我解决这个问题。感谢乔治保存工作的日子:)

+10

如果您的网站不在根级别上,该怎么办?例如,如果该网站是在'/部分/文件夹/主页/ Index',一个链接'/出版/胶囊/ 4'不会导致您的网站。 – Kobi 2013-03-17 08:23:51

+0

我看到它引发了正确的Action方法(Capsule)。上面链接配置的剃须刀视图页面(.cshtml)不在根目录。该操作被正确调用,因为我在RouteConfig中配置了该操作。 – Naga 2013-03-17 13:23:18

+0

@Kobi,你是在我的情况的权利,不过内容是在同一台服务器及因此上述解决方案工作。 – Naga 2014-08-02 14:31:36