2013-03-04 5 views
2

Я создал контроллер под названием ApplicationController, который отправляет общую информацию ко всем моим представлениям, каждый контроллер в моей системе наследует от нее.Html.ActionLink() добавляет нежелательную папку, когда actionName как "/ controllerName/action /"

В частичный вид я использую Html.ActionLink():

@Html.ActionLink("Link Title", "/MyController/MyAction") 
// OUTPUT: <a href="/MyIISVirtualDirectory/Application/MyController/MyAction">Link Title</a> 

Если я нажмите на ссылку я получить 404.

Но если я использую:

@Html.ActionLink("Link Title", "MyAction", "MyController") 
// OUTPUT: <a href="/MyIISVirtualDirectory/MyController/MyAction">Link Title</a> 

Everything работает отлично.

Почему в первом примере метод выводит/Application /? Как я могу удалить это по умолчанию?

+2

Возможно, потому что помощник ActionLink ожидает имя действия, а не путь к действию? –

+1

Если вы собираетесь пройти путь, просто создайте ссылку «вручную» вместо использования ActionLink. Но если вы хотите использовать ActionLink, то передавайте только имя действия и, возможно, имя контроллера. –

+2

Вы посмотрели документы? http://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.actionlink%28v=vs.108%29.aspx этот вопрос по существу сводится к: «Почему я не могу это сделать? это неподдерживаемым образом?«если вам действительно нужно или нужно сделать это таким образом, реализуйте свой собственный ActionLinkHelper – solidau

ответ

3

Если вы используете бритву 2.0 (ASP.NET MVC 4), вы можете просто использовать обычную старую ссылку:

<a href="~/MyController/MyAction">Link Title</a> 

HREF будет преобразуются в /MyController/MyAction, если ваше приложение размещается на / или до /MyIISVirtualDirectory/MyController/MyAction, если ваше приложение размещено на /MyIISVirtualDirectory.

В бритве 1.0 (ASP.NET MVC 3), синтаксис является немного более многословным:

<a href="@Href("~/MyController/MyAction")">Link Title</a> 

Более подробную информацию here.

+0

If you want to use ~ to get the path, using an extension method as my answer shows would be much more DRY and SOLID – solidau

+0

I think that's personal preference. To me, 'Link Title »является стандартным. Любой его сразу понимает, поскольку он является встроенной функцией в рамках и, действительно, не упрощается. Если не было много логики для визуализации ссылка (маловероятная), кодирующая метод расширения, просто для того, чтобы сделать простой 'string.Format()', кажется, немного перехитрил IMO. Кроме того, в вашем ответе есть проблема. –

0

Я не думаю, что можно вызвать метод действия с контроллера, указав маршрут как параметр. Вот ссылка со всеми расширениями для Html.ActionLink.

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.actionlink(v=vs.108).aspx

Маршруты определяются в global.asax, где вы можете определить ваши маршруты в соответствии с вашими потребностями. The/Application/from output - ваш ApplicationController. По умолчанию контроллер, в котором вы вызываете представление, является контроллером, который ищет метод действия.

Надеюсь, это поможет.

+0

Упрощение: Есть ли в любом случае я могу получить обратную информацию? Например, в CakePHP, если я вызываю Router :: url ("/ controllerName/actionName"), он вернет мне полный путь к этому конкретному действию внутри контроллера, включая папку приложения. – LeandroCR

0

Реализовать свой собственный помощник Действие Ссылка:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MvcApplication1.Controllers 
{ 
    public static class CustomHtmlHelpers 
    { 
     public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string routePath) 
     { 
      //you can do any sort of logic you want here. 
      return MvcHtmlString.Create(string.Format("<a href=\"{0}\">{1}<a/>", routePath, linkText)); 
     } 
    } 
} 
1

простой способ сделать то, что вы хотите, это:

<a href="@Url.Content("~/MyController/MyAction")">Link Title</a> 

однако, он ломает полностью логику маршрутизации. Это должно использоваться для файлов содержимого (как следует из названия), css, js и т. Д., А не для действий контроллера. Если вы измените маршрутизацию по умолчанию, вышеуказанный URL-адрес, вероятно, сломается.

+0

I don't think you understood the problem. My application is under a virtual folder, i need to get it automaticaly and i wonder if a helper could do that for me. – LeandroCR

+1

Ah, typo, sorry. It's fixed now. – Nenad

+0

Regarding the note about 'Url.Content' breaking route logic, the problem also exists with 'Url.Action' (i.e. if you change your routes and forget to update your views, your links will break as those parameters you pass to 'Url.Actions' are mere strings.) –