Pregunta

Tengo un problema como Texto del enlace

Todos mis enlaces se ven así: htp // sitio/controlador/acción/id

Acabo de agregar área llamado Backend.

Mi controlador:

[ActionLinkArea("")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Ahora, cuando trato de obtener una URL de conroladores usando

@Html.ActionLink<HomeController >(c => c.Index(), "Home") 

Todo funciona bien, y URL es htp: // sitio/homecontroller/index/

Pero cuando uso el método de extensión de Microsoft.web.mvc.dll

 @Html.BuildUrlFromExpression<HomeController>(c => c.Index())

Obtengo url htp: // sitio/Backend/Homecontroller/index/

¿Cómo puedo obtener URL sin área usando BuildUrlFromExpression y por qué ActionLink funciona bien pero BuildUrlFromExpression no?

¿Fue útil?

Solución

Es Microsoft Bug.

http://aspnet.codeplex.com/workitem/7764

El método utiliza internamente LinkBuilder.BuildUrlFromExpression (). Este último llama Routecollection.getVirtualPath (context, RouteValues) en lugar de Routecollection.getVirtualPathForArea (context, RoutEvalues); lo que causa resultados no válidos al usar áreas.

Lo hice y el método devuelve la URL correcta

Otros consejos

¡Tengo mejor respuesta!

public static string Image<T>(this HtmlHelper helper, Expression<Action<T>> action, int width, int height, string alt)
            where T : Controller
    {
        var expression = action.Body as MethodCallExpression;
        string actionMethodName = string.Empty;
        if (expression != null)
        {
            actionMethodName = expression.Method.Name;
        }
        string url = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection).Action(actionMethodName, typeof(T).Name.Remove(typeof(T).Name.IndexOf("Controller"))).ToString();         
        //string url = LinkBuilder.BuildUrlFromExpression<T>(helper.ViewContext.RequestContext, helper.RouteCollection, action);
        return string.Format("<img src=\"{0}\" width=\"{1}\" height=\"{2}\" alt=\"{3}\" />", url, width, height, alt);
    }

<%=Html.Image<ClassController>(c => c.Index(), 120, 30, "Current time")%>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top