2011-08-14 13 views
7

Ho un metodo di estensione html per recuperare l'URL per un file che si trova nella stessa cartella della vista.MVC3: Qual è il modo migliore per ottenere il percorso di visualizzazione da un oggetto HtmlHelper?

Esempio

/Views/Home/Index.cshtml 
/Views/Home/Index.js 
/Views/Home/Index.css 

È questo il modo migliore per farlo? Non mi piace perché devo fare il seguente cast. Sono sicuro che RazorView non funzionerà se si utilizza un motore di visualizzazione diverso, ma su di esso IView ha solo un metodo Render.

((RazorView)helper.ViewContext.View).ViewPath 

Ecco il metodo integrale

public static string GetUrl(this System.Web.Mvc.HtmlHelper helper, string fileName) { 
    string virtualPath = ((RazorView) helper.ViewContext.View).ViewPath; 
    virtualPath = virtualPath.Substring(0, virtualPath.LastIndexOf("/") + 1); 
    return virtualPath + fileName; 
} 
+0

Cosa stai finalmente intenzione di fare con l'URL? Inseriscilo in un codice HTML e invialo al browser? Se sì, è improbabile che funzioni poiché la sottodirectory Views è protetta e non accessibile tramite un URL. – Codo

+0

Ho già reso accessibili questi file tramite web.config rimuovendo BlockViewHandler dall'elenco dei gestori. –

+0

Sei sicuro che sia una buona cosa da fare? Non ti dispiace se le persone scaricano i tuoi file .cshtml per controllarli per i bug di sicurezza? – Codo

risposta

-3

È possibile ottenere l'URL corrente utilizzando questo: How to get current page URL in MVC 3. E quindi analizzare l'URL da lì.

HTH.

+0

Questa domanda riguarda come ottenere il percorso virtuale per la vista, non l'URL della richiesta. – Dunc

1

sto usando qualcosa di simile:

public static string GetUrl(this HtmlHelper html, string filename) 
{ 
    var viewPath = ((WebViewPage)html.ViewDataContainer).VirtualPath; 
    var viewFolder = viewPath.Substring(0, viewPath.LastIndexOf("/") + 1); 
    var virtualScriptPath = viewFolder + filename; 

    var urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
    return urlHelper.Content(virtualScriptPath); 
} 

C'è un cast di WebViewPage lì, ma penso (mi corregga se sbaglio) che funzionerà indipendentemente dal fatto che si sta utilizzando Razor o motore di visualizzazione Webforms.

6

Se si utilizza Razor view engine, È possibile utilizzare questo:

((System.Web.Mvc.RazorView)htmlHelper.ViewContext.View).ViewPath 

Buona fortuna

Problemi correlati