0

I'm new to ASP MVC programming and wanna ask about how the route is configured.

For example I have the Home Controller

public ActionResult Home(){
   return View("Index")
}

This will find the Index.cshtml under /Views/Home/

However if I rename the Home Folder to Homees for example, the view is not found and also I try to return View with View("~/Views/Homees/Index.cshtml") this is not change that the controller not found the view.

Is this the default of the asp mvc? and it's possible to change this one?

1
  • Can you please specify what is error ? Commented Apr 9, 2016 at 11:31

5 Answers 5

2

There are few points.

  1. ASP.net MVC is convention based. It is also specified by @Petar Minev. When it comes to search for view it use following method. It take controller name as directory name and view name file name with different extention ( like cshtml, vbhtml , aspx ) based on view engine. ( As you are using cshtml it seems that you are using both Razor and Webform view engine).

For search it will first go to directory with controller name and search for specified view. If it is not available there then it goes to shared folder.

Above is default behavior of ASP.net MVC.

  1. Now you change folder name then first solution you have tried that must work as it works for me. ( Please check that your folder name is correct. Make sure you did not rename for area directory).

    public ActionResult Home(){
       return View("~/Views/Homees/Index.cshtml")
    }
    
  2. Another solution is to rename controller with HomeesController ( So it will automatically locate correct directory)

  3. If you continue with this convention for other folder like the way you add "es" in "Home" it is better to add this convention in default search for view. ( You can do this by either inherit from default RazorViewEngine or change RazorViewEngine parameter)

For example

protected void Application_Start()
        {
            RazorViewEngine engine = (RazorViewEngine)ViewEngines.Engines[1];
            List<string> currentFormats =  engine.ViewLocationFormats.ToList();
            currentFormats.Insert(0,"~/Views/{1}es/{0}.cshtml");
            engine.ViewLocationFormats = currentFormats.ToArray();
            ... Other application start code
        }
Sign up to request clarification or add additional context in comments.

Comments

1

Razor View engine is default view engine for ASP.Net MVC. This Razor view engine is configured to locate path at specified path i.e. "~/Views/{1}/{0}.cshtml". Here {1} placeholder specifies controller name and {0} represents view name.

Say, for Example any request for Index action in Home controller will look for view at "~/Views/Home/Index.cshtml".

Now if you want to change this default path then you have to define custom view engine. Here a sample example how can you define a custom view engine and change the default path.

  public class MyCustomViewEngine : RazorViewEngine
{

    public MyCustomViewEngine()
    {         

        ViewLocationFormats = new string[] {
            "~/MyViews/{1}/{0}.cshtml",
            "~/MyViews/Shared/{0}.cshtml" };

        MasterLocationFormats = new string[] {
            "~/MyViews/{1}/{0}.cshtml",
            "~/MyViews/Shared/{0}.cshtml"};

        PartialViewLocationFormats = new string[] {
            "~/MyViews/{1}/{0}.cshtml",
             "~/MyViews/Shared/{0}.cshtml"};

        FileExtensions = new string[] { "cshtml" };
    }
}

You also need to register custom view engine with ASP.Net run time at Application _Start() event.

        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new MyCustomViewEngine());

Comments

1

Your controller code is seems wrong, if your controller name is Home then code will be like this with index action

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View("~/Views/Homees/index.cshtml");
        }
        public ActionResult Contact()
        {
            return View();
        }
    }

you just used the controller name as action name, by default in view folder there is a separate folder for each controller like for Home controller there will be a folder named Home, and inside that there will be separate cshtml file for each action result, like for my code there is a two action result name Index and Contact so under Home folder there will be two separate cshtml for both as index.cshtml and contact.cshtml. So when we request index action it will go for index.cshtml and for Contact action contact.cshtml by default, but we can spacify our own view for any action like my index view, and it works fine, your approach was correct but only problem was the Controller name and action name I think, try this way it may help

Comments

0

by default Microsoft's ASP.NET MVC is created over one Folder Convention which means that all files that will be Controllers should be under Controller folder, each file which will be View should be under View folder,

also if you create Mvc Route for example MyProfile, in the MVC you'll get contorller with this name and folder under the view's.

All this is controlled by the default routing which is knowing where to find, Views and controllers, so if you want to make some changes or modifications you should go to ASP.NET web site and look some tutorials for MVC Routing

Hope i helped :)

Comments

0

Simple just go to App_Start and Open RouteConfig.cs File and change route controller "Home" to "Homees" by default it set as "Home". If you rename your HomeController to "HomeesController" you should change to rountconfig by default route. check below image

enter image description here

After that open "HomeesController" from Controller folder here you can add action for view

 public ActionResult Index()
 {
    return View();
 }

enter image description here

and Add Action to View "Homees" Folder

enter image description here

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.