Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC3: What is the best way to get the view path from an HtmlHelper object?

I have an html extension method to retrieve the URL for a file that is located in the same folder as the view.

Example

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

Is this the best way to do this? I don't like it because I have to do the following cast. I am sure that RazorView is not going to work if you are using a different view engine, but IView only has a Render method on it.

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

Here is the full method

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;
}
like image 736
Leslie Hanks Avatar asked Aug 14 '11 17:08

Leslie Hanks


2 Answers

If you use Razor view engine, You can use this:

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

Good luck

like image 93
MohammadReza Daghestani Avatar answered Nov 05 '22 13:11

MohammadReza Daghestani


I'm using something like this:

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);
}

There is a cast to WebViewPage there, but I think (correct me if I'm wrong) that it will work regardless of whether you are using Razor or Webforms view engine.

like image 43
gschuager Avatar answered Nov 05 '22 11:11

gschuager