2011-01-05 27 views
4

我有一個像link text如何指定默認片區Html.BuildUrlFromExpression打電話

問題我所有的鏈接看起來像這樣:// HTP網站/控制器/操作/ ID

我只是添加區域稱爲BackEnd

我的控制器:

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

現在,當我嘗試使用

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

一切工作正常得到一些電腦板URL和URL是HTP://網站/ HomeController中/索引/

但是當我使用的擴展方法從Microsoft.Web.Mvc.dll

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

我得到URL HTP://網站/ 後端/HomeController中/索引/

ActionLink的如何,我可以得到不使用BuildUrlFromExpression區URL,爲什麼工作正常,但 BuildUrlFromExpression不是?

+0

我只是還拆開Microsoft.Web.Mvc,發現這個代碼VirtualPathData virtualPath = routeCollection.GetVirtualPath(上下文,routeValuesFromExpression);其中routeCollection abd上下文 - 我們從HtmlHelper獲得,routeValuesFromExpression - 從表達式返回值與Area,但routeValuesFromExpression具有正常值。 – 2011-01-10 11:44:56

+0

我找到了答案:http://aspnet.codeplex.com/workitem/7764該方法在內部使用LinkBuilder.BuildUrlFromExpression ()。 後者調用 routeCollection.GetVirtualPath(context,routeValues) 而不是 routeCollection.GetVirtualPathForArea(context,routeValues); 使用區域時會導致無效結果。 – 2011-01-10 14:07:36

回答

3

這是微軟的bug。

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

的方法,在內部使用LinkBuilder.BuildUrlFromExpression()。後者調用routeCollection.GetVirtualPath(context,routeValues)而不是routeCollection.GetVirtualPathForArea(context,routeValues);這會在使用區域時導致無效結果。

我做到了,方法返回正確的URL

2

我有更好的回答!

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