Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC 3 won't recognise .cshtml view files

I have ported an mvc 3 app from vs 2010 to vs2012.

The ported app is using .NET 4.

All the old bits work, but with a new view, created in vs 2012, the view engine is not looking for .cshtml files for the view.

For example, when the user requests the index action on the Welcome controller in the Solicitors area, the url is:

mysite.com/solicitors/welcome/gg 

(where gg is the user name). In that case, the error that comes back is:

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Areas/Solicitors/Views/Welcome/Index.aspx ~/Areas/Solicitors/Views/Welcome/Index.ascx ~/Areas/Solicitors/Views/Shared/Index.aspx ~/Areas/Solicitors/Views/Shared/Index.ascx ~/Views/Welcome/Index.aspx ~/Views/Welcome/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Index.ascx ~/Areas/Solicitors/Views/Welcome/gg.master ~/Areas/Solicitors/Views/Shared/gg.master ~/Views/Welcome/gg.master ~/Views/Shared/gg.master ~/Areas/Solicitors/Views/Welcome/gg.cshtml ~/Areas/Solicitors/Views/Welcome/gg.vbhtml ~/Areas/Solicitors/Views/Shared/gg.cshtml ~/Areas/Solicitors/Views/Shared/gg.vbhtml ~/Views/Welcome/gg.cshtml ~/Views/Welcome/gg.vbhtml ~/Views/Shared/gg.cshtml ~/Views/Shared/gg.vbhtml

I have already added the following key to appsettings in web.config, but it makes no difference.

<add key="webpages:Version" value="1.0" />

EDIT:

Route in SolictorAreaRegistration.cs:

context.MapRoute(
                "Solicitors_Welcome",
                "Solicitors/Welcome/{nameUser}",
                new { controller = "Welcome", action = "Index", nameUser = UrlParameter.Optional }
            );

EDIT 2:

Using RouteDebug, I can see that the correct controller and action are found.

Route Data

Key Value

nameUser: gg

controller: Welcome

action: Index

Data Tokens

Key Value

Namespaces: System.String[]

area: Solicitors

UseNamespaceFallback: False

EDIT 3:

The route is found correctly, as I can see from debugging: the Index action is hit.

The problem happens when the line call the view is called:

namespace MyApp.Areas.Solicitors.Controllers
{
    [Authorize]
    public partial class WelcomeController : Controller
    {
        //
        // GET: /Solicitors/Welcome/
        public virtual ActionResult Index(string nameUser)
        {
            return View("Index", nameUser);
        } 
    }
}
like image 430
awrigley Avatar asked Sep 10 '12 12:09

awrigley


2 Answers

OK, got to the bottom of it:

The Problem:

The problem is that the model of my view is of type string. In my action, I was passing in a string as the model parameter:

public virtual ActionResult Index(string nameUser)
        {
            return View("Index", nameUser);
        }

This will clash with one of the overloads of Controller.View(...):

View(string, string)

The second parameter expects the name of a layout file. When you do this, MVC goes off looking for a layout file with a name of the value of your string, which could be, for example:

"Hello, World. I'm an idiot, but if you give me a decent error message, I might be able to fix the bug."

Obviously, a layout file with that name doesn't exist. Nor does a layout file called "gg" either (my (test) solicitor's username).

The Solution:

The solution is simple:

Specify that the second parameter is the model, not the layout.

public virtual ActionResult Index(string nameUser)
        {
            return View("Index", model: nameUser);
        }

Useful Article:

To view an extended discussion of this very issue, see the following article:

MVC Gotcha: Beware when using your view's model is a string

Many thanks to heartysoft.com for the enlightenment.

like image 151
awrigley Avatar answered Nov 09 '22 21:11

awrigley


It is looking as you can see from the error message:

~/Areas/Solicitors/Views/Welcome/gg.cshtml 

If you need to look for the Index view then you need to specify it:

http://mysite.com/solicitors/welcome/index/gg 
like image 1
Darin Dimitrov Avatar answered Nov 09 '22 22:11

Darin Dimitrov