简体   繁体   中英

ASP.NET Core MVC: The partial view was not found in a custom feature folder structure

I have read a nice article about how I can use feature folder structure in my ASP.NET Core MVC application. My plan is to use then a feature folder structure to organize my web application in a better way. First of all lets see my folder structure:

...
wwwroot
Claims
   Controllers
   Services
   Views
      Shared
Map
...

I have followed the article and I implemented the IViewLocationExpander like the following:

public class MyViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues(ViewLocationExpanderContext context)
    {
        context.Values["customviewlocation"] = nameof(MyViewLocationExpander);
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        var viewLocationFormats = new[]
        {
            "/Claims/Views/{0}.cshtml",
            "/Claims/Views/Shared/{0}.cshtml"
        };
        return viewLocationFormats;
    }
}

I placed my main Claims.cshtml view in the "/Claims/Views/" folder. At the beginning of my Claims.cshtml I have to following line to render my partial view:

@Html.Partial("_NewClaimPopup");

As for the _NewClaimPopup.cshtml, it placed it into the path "/Claims/Views/Shared". But unfortunately I got the following exception when trying to GET the following url: http://localhost:13078/Claims/Claims

InvalidOperationException: The partial view '_NewClaimPopup' was not found. The following locations were searched:
/Views/Claims/_NewClaimPopup.cshtml
/Views/Shared/_NewClaimPopup.cshtml

It seems that the custom paths are successfully added by the implementation of IViewLocationExpander.

Additional infos:

  1. What I also tried is to use "~" sign in paths of the implementation of IViewLocationExpander, so: "~/Claims/Views/{0}.cshtml" and "~/Claims/Views/Shared/{0}.cshtml" but it does not help.
  2. I tried to use absolute path for rendering my partial view, but still nothing

    @Html.Partial(""~/Claims/Views/_NewClaimPopup.cshtml");

And of course, I registered my expander in the Startup.cs:

    services.Configure<RazorViewEngineOptions>(options => options.ViewLocationExpanders.Add(new MyViewLocationExpander()));

Last but not least I attach a picture about my project structure: 在此处输入图片说明

Any other idea? Thanks in advance for any help!

I have made sample application. You can download from below link Custom View Location

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM