2011-01-05 8 views
4

I wie link text wie dieseWie Standardbereich angeben Html.BuildUrlFromExpression

Alle meine Links suchen haben Problem zu nennen: htp // site/controller/action/id

I Gebiet genannt gerade hinzugefügt BackEnd.

Mein Controller:

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

Jetzt, wenn ich versuchen, einige conroller URL zu erhalten mit

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

Alle funktioniert gut, und URL ist htp: // site/Homecontroller/Index/

Aber wenn ich Erweiterungsmethode von Microsoft.Web.Mvc.dll

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

ich URL htp: // site/BackEnd/Homecontroller/Index/

Wie kann ich URL ohne Fläche mit BuildUrlFromExpression bekommen und warum Action nicht in Ordnung, aber BuildUrlFromExpression funktioniert?

+0

Ich habe gerade Microsoft.Web.Mvc zerlegt und festgestellt, dass dieser Code VirtualPathData virtualPath = routeCollection.GetVirtualPath (Kontext, routeValuesFromExpression); Wo routeCollection abd context - wir bekommen von HtmlHelper, und routeValuesFromExpression - aus Ausdruck Rückgabewert mit Area, aber routeValuesFromExpression hat normalen Wert. –

+0

Ich habe die Antwort gefunden: http://aspnet.codeplex.com/workitem/7764 Die Methode verwendet intern LinkBuilder.BuildUrlFromExpression (). Letzterer ruft routeCollection.GetVirtualPath (context, routeValues) anstelle von routeCollection.GetVirtualPathForArea (context, routeValues); verursacht ungültige Ergebnisse bei der Verwendung von Bereichen. –

Antwort

3

Es ist Microsoft Bug.

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

Das Verfahren verwendet intern LinkBuilder.BuildUrlFromExpression(). Letzterer ruft routeCollection.GetVirtualPath (context, routeValues) anstelle von routeCollection.GetVirtualPathForArea (context, routeValues) auf; Dies führt zu ungültigen Ergebnissen bei der Verwendung von Bereichen.

Ich habe es getan und die Methode gibt die richtige URL zurück

2

Ich habe bessere Antwort!

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")%> 
Verwandte Themen