2013-03-15 12 views
7

mam kod jak poniżej w związku z ostrzamiRazor MVC4 Url.Action nie działa

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

podczas I kliknij dwukrotnie na tej pozycji jest przekierowany na poniższy adres URL

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

Ale podczas gdy oczekiwano był

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

Poniżej 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 } 
); 

Uprzejmie sugerujemy.

Zawęziłem problem. Problem z plikiem Html.Raw jest przyczyną problemu. Mam kod taki jak

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

zmienna zawiera wygenerowany html z Ur.Action. Jeśli po prostu umieszczam bezpośrednio wygenerowany kod HTML w widoku maszynowym bez Html.Raw, to działa dobrze. Ale jeśli wziąć Html.Raw do wykonania wygenerowany skrypt html, który jest wyświetlany jak

&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... 

Czy istnieje sposób, że mogę wyświetlić HTML skrypt w zmiennej bez użycia kodowania Html.Raw? Połowa problemu została rozwiązana przy użyciu HtmlString zamiast zmiennej łańcuchowej do przechowywania wygenerowanego skryptu HTML, ale HtmlString nie mógł dekodować składni @ Url.Action w ciągu znaków.

Poniżej znajduje się najnowszy kod, który próbuję uruchomić. Proszę pomóż.

   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

Czy nie ma powodu, aby nie używać helpera Html.ActionLink? – Floremin

+0

Możesz spróbować zastąpić podwójne cudzysłowy pojedynczym dla href. Być może podwójne cytaty w kodzie HTML i C# mylą silnik renderujący (Razor). – Floremin

+0

czy masz końcówkę?kod widoku do opublikowania, który owija kod Dima

Odpowiedz

10

Wiem, że jest trochę za późno, ale natknąłem się na ten post, gdy czegoś szukam.

Tutaj w twoim problemie z kodem znajduje się tag kotwicy i podwójne cudzysłowy.

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

Jesteś technicznie mówi parser które odwołują hiperłącze pomiędzy „URL” (cudzysłów) to znaczy href jest @ Url.Action (. Można to zrobić w ten sposób (użyć pojedynczego cudzysłowu aby przypisać href) i nadzieję, że działa

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

teraz href będzie @ Url.Action ("Szczegóły", "Mycontr", new {id = 16}, Request.Url.Scheme)

+0

To prawda, że ​​podwójny cudzysłów w podwójnym cudzysłowie to wprowadzający w błąd javascript – Naga

-4

Rozwiązałem problem. Naprawdę nie potrzebuję @ Url.Action do href. Właśnie otrzymuje kod do logicznej ścieżki jak poniżej

/Publication/Capsule/ + capId 

this link pomógł mi rozwiązać ten problem. Dzięki temu Jorge oszczędza dni pracy :)

+10

Co się stanie, jeśli Twoja witryna nie znajduje się na poziomie głównym? Na przykład, jeśli witryna znajduje się w katalogu '/ some/folder/Home/Index', link do'/Publication/Capsule/4' nie prowadzi do twojej witryny. – Kobi

+0

Widziałem, że uruchomiła odpowiednią metodę działania (Capsule). Strona podglądu maszynki do golenia (.cshtml), w której skonfigurowano powyższy link, nie znajduje się w katalogu głównym. Akcja jest wywoływana poprawnie, ponieważ mam to skonfigurowane w RouteConfig. – Naga

+0

@Kobi, masz rację, jednak w moim przypadku zawartość jest na tym samym serwerze i dlatego powyższe rozwiązanie działało. – Naga

Powiązane problemy