Come specificare l'area predefinita alla chiamata HTML.Buildurlfromexpression
-
25-09-2019 - |
Domanda
Ho problemi come Testo di collegamento
Tutti i miei collegamenti sono così: htp // sito/controller/azione/id
Ho appena aggiunto l'area chiamata Backend.
Il mio controller:
[ActionLinkArea("")]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Ora quando provo a ottenere un po 'di URL conroller usando
@Html.ActionLink<HomeController >(c => c.Index(), "Home")
Tutto funziona bene e l'URL è htp: // sito/homecontroller/indice/
Ma quando utilizzo il metodo di estensione da Microsoft.Web.mvc.dll
@Html.BuildUrlFromExpression<HomeController>(c => c.Index())
Ottengo url htp: // sito/Backend/HomeController/Index/
Come posso ottenere URL senza area utilizzando buildurlfromexpression e perché ActionLink funziona bene ma buildurlfromexpression no?
Soluzione
È Microsoft Bug.
http://aspnet.codeplex.com/workitem/7764
Il metodo utilizza internamente LinkBuilder.buildurlfromexpression (). Quest'ultimo chiama RouteCollection.getvirtualpath (contesto, routevalues) anziché RouteCollection.getvirtualpathforarea (contesto, routevalues); che provoca risultati non validi quando si utilizzano aree.
L'ho fatto e il metodo restituisce l'URL corretto
Altri suggerimenti
Ho una risposta migliore!
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")%>