Partial Views ... No engine supports the searched locations
I'm trying to bite the bullet and force myself on the MVC train. I have a fresh U7.1 solution and created a homepage view template. In the partials directory, I have a login form. Basically following the example on Umbraco.TV. Got the model, and surfacecontroller in the appropriate directories. I go to view the magic like the example, I'm greeted with:
The partial view 'LoginForm' was not found or no view
engine supports the searched locations. The following locations were
searched: ~/Views/LoginFormSurface/LoginForm.aspx ~/Views/LoginFormSurface/LoginForm.ascx ~/Views/Shared/LoginForm.aspx ~/Views/Shared/LoginForm.ascx ~/Views/LoginFormSurface/LoginForm.cshtml ~/Views/LoginFormSurface/LoginForm.vbhtml ~/Views/Shared/LoginForm.cshtml ~/Views/Shared/LoginForm.vbhtml
Do I need to configure something to look in the partials directory?
As a test, I renamed the the ~/views/partials folder to ~/views/shared and the form renders fine. Rather than create the view in studio, I created it through the back-office just to try something. It created the Partials folder again, but didn't avoid the error. Now I'm starting to think this is a bug in starting configuration of U7.1 or something. I might try U6 and see what happens.
This thread offered some insight. I was using Html.Action("Index","LoginFormSurface") like the video example on Umbraco.TV unsuccessfully. Now, I can get the form to render if I do @Html.Partial("LoginForm", new LoginFormViewModel()).
Also if I move my partial to the Shared folder it find it but now I get an error:
The model item passed into the dictionary is of type 'Umbraco.Web.Models.RenderModel', but this dictionary requires a model item of type 'mytype'
So it looks like the Surface controller is not working as it was in 7.0.2 which looks related to your issue. The Partials folder has always worked so not sure why its not a valid location any more for Surface Controller partials. It seems ok for standard partials.
Just been chatting to Sebatstiaan and it looks like this is a bug. If you put the View into a folder of the controller without the controller suffix ( a la mvc stylee) it works.
e.g. ControllerNameSurface
And dont forget to delete your Shared view.
I actually like this way better than it been in the partials. Its closer to true MVC organisation of files and its easier to spot the custom forms using surface controllers.
I'm not so sure I follow. Here are the files and their location:
~/Controllers/LoginFormSurfaceController.cs ~/Models/LoginFormViewModel.cs ~/Views/Homepage.cshtml (making the @Html.Action("Index", "LoginFormSurface") call) ~/Views/Partials/LoginForm.cshtml
I tried renaming the partial to LoginFormSurface.cshtml and it didn't work.
The partial view 'LoginFormSurface' was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/LoginFormSurface/LoginFormSurface.aspx ~/Views/LoginFormSurface/LoginFormSurface.ascx ~/Views/Shared/LoginFormSurface.aspx ~/Views/Shared/LoginFormSurface.ascx ~/Views/LoginFormSurface/LoginFormSurface.cshtml ~/Views/LoginFormSurface/LoginFormSurface.vbhtml ~/Views/Shared/LoginFormSurface.cshtml ~/Views/Shared/LoginFormSurface.vbhtml
and put your Login Partial in there.This matches the above route (in the error)
~/Views/LoginFormSurface/LoginFormSurface.cshtml
Make sure you don thave the login partial in the folder called Shared.
Just be aware that ths aint currently working as it should! The View normally lives in the Partials folder as in the videos but a bug has crept in by the looks of things.
Gotcha... It did work as you discovered even after renaming the view back to LoginForm.cshtml (and updating the ActionResult). Unfortunately, the folders are not visible in the backoffice so you lose editing capability. Not good for this client.
Dunno if this confirms what you just said. I got to the posting part of my login form and receive the following error:
Could not find a Surface controller route in the RouteTable for controller name LoginSurfaceController
I've accepted the editing component, they don't need to edit these pages. Here's the directory structure I have currently:
~/Controllers/LoginSurfaceController.cs ~/Models/LoginFormViewModel.cs ~/Views/Homepage.cshtml (making the @Html.Action("Index", "LoginFormSurface") call) ~/Views/LoginSurface/LoginForm.cshtml
If I want to continue with 7.1.0 is there something I could do as a workaround (until fix is out), or should I consider downgrading Umbraco before I get too far vested when we enter content?
@Jon
Bonus info 1: you don't HAVE to call it SomethingSurfaceController, just like in "regular" MVC you can just call it SomethingController and indeed the convention is not to add the Controller suffix in BeginForm or BeginUmbracoForm.
Bonus info 2: you can also do a "typed" BeginUmbracoForm, but then you do need the whole class name (as it is properly typed):
I've fixed the Partials error for 7.1.1 (out soon).
I can't repro the The model item passed into the dictionary is of type 'Umbraco.Web.Models.RenderModel', but this dictionary requires a model item of type 'mytype'" thing, not sure what's going on there.
My Controller and ViewModel look like this:
public class ContactController : SurfaceController
{
[ChildActionOnly]
public ActionResult Index()
{
return PartialView("ContactForm", new ContactViewModel());
}
[HttpPost]
public ActionResult HandleContactForm(ContactViewModel model)
{
if (ModelState.IsValid == false)
return CurrentUmbracoPage();
return RedirectToCurrentUmbracoPage();
}
}
public class ContactViewModel
{
public string Email { get; set; }
public string Message { get; set; }
}
In my Layout (@inherits UmbracoTemplatePage) I call @Html.Action("Index", "Contact")
And in my Partials folder the Contact view looks like:
After upgrading to 7.1.1 I still received the original error. I just referenced the view differently after moving the views to the Partials folder and done with it.
return PartialView("~/Views/Partials/LoginForm.cshtml", new LoginFormViewModel());
@Jon I can't understand how the problem would still be there. Are you inheriting from SurfaceController? Are you using NuGet and did you upgrade by doing Update-Package or through the NuGet dialogs in VS?
Partial Views ... No engine supports the searched locations
I'm trying to bite the bullet and force myself on the MVC train. I have a fresh U7.1 solution and created a homepage view template. In the partials directory, I have a login form. Basically following the example on Umbraco.TV. Got the model, and surfacecontroller in the appropriate directories. I go to view the magic like the example, I'm greeted with:
The partial view 'LoginForm' was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/LoginFormSurface/LoginForm.aspx
~/Views/LoginFormSurface/LoginForm.ascx
~/Views/Shared/LoginForm.aspx
~/Views/Shared/LoginForm.ascx
~/Views/LoginFormSurface/LoginForm.cshtml
~/Views/LoginFormSurface/LoginForm.vbhtml
~/Views/Shared/LoginForm.cshtml
~/Views/Shared/LoginForm.vbhtml
Do I need to configure something to look in the partials directory?
As a test, I renamed the the ~/views/partials folder to ~/views/shared and the form renders fine. Rather than create the view in studio, I created it through the back-office just to try something. It created the Partials folder again, but didn't avoid the error. Now I'm starting to think this is a bug in starting configuration of U7.1 or something. I might try U6 and see what happens.
This thread offered some insight. I was using Html.Action("Index","LoginFormSurface") like the video example on Umbraco.TV unsuccessfully. Now, I can get the form to render if I do @Html.Partial("LoginForm", new LoginFormViewModel()).
I've just upgraded a site from Version 7.0.2 to 7.1 and it appears something has changed.
The Partials views is no longer getting searched as a location when using a surface controller and calling its GET with
Also if I move my partial to the Shared folder it find it but now I get an error:
The model item passed into the dictionary is of type 'Umbraco.Web.Models.RenderModel', but this dictionary requires a model item of type 'mytype'
So it looks like the Surface controller is not working as it was in 7.0.2 which looks related to your issue. The Partials folder has always worked so not sure why its not a valid location any more for Surface Controller partials. It seems ok for standard partials.
Just been chatting to Sebatstiaan and it looks like this is a bug. If you put the View into a folder of the controller without the controller suffix ( a la mvc stylee) it works.
e.g. ControllerNameSurface
And dont forget to delete your Shared view.
I actually like this way better than it been in the partials. Its closer to true MVC organisation of files and its easier to spot the custom forms using surface controllers.
I'm not so sure I follow. Here are the files and their location:
~/Controllers/LoginFormSurfaceController.cs
~/Models/LoginFormViewModel.cs
~/Views/Homepage.cshtml (making the @Html.Action("Index", "LoginFormSurface") call)
~/Views/Partials/LoginForm.cshtml
I tried renaming the partial to LoginFormSurface.cshtml and it didn't work.
The partial view 'LoginFormSurface' was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/LoginFormSurface/LoginFormSurface.aspx
~/Views/LoginFormSurface/LoginFormSurface.ascx
~/Views/Shared/LoginFormSurface.aspx
~/Views/Shared/LoginFormSurface.ascx
~/Views/LoginFormSurface/LoginFormSurface.cshtml
~/Views/LoginFormSurface/LoginFormSurface.vbhtml
~/Views/Shared/LoginFormSurface.cshtml
~/Views/Shared/LoginFormSurface.vbhtml
INside the Views folder:
Create a folder called LoginFormSurface
and put your Login Partial in there.This matches the above route (in the error)
~/Views/LoginFormSurface/LoginFormSurface.cshtml
Make sure you don thave the login partial in the folder called Shared.
Just be aware that ths aint currently working as it should! The View normally lives in the Partials folder as in the videos but a bug has crept in by the looks of things.
Ive created a ticket here:
http://issues.umbraco.org/issue/U4-4604
Gotcha... It did work as you discovered even after renaming the view back to LoginForm.cshtml (and updating the ActionResult). Unfortunately, the folders are not visible in the backoffice so you lose editing capability. Not good for this client.
Thats brave letting clients edit the backend! :)
I also found that the Post also fails so it is a bug that will get fixed and probably back to using the partials folder in 7.1.1
Dunno if this confirms what you just said. I got to the posting part of my login form and receive the following error:
Could not find a Surface controller route in the RouteTable for controller name LoginSurfaceController
I've accepted the editing component, they don't need to edit these pages. Here's the directory structure I have currently:
~/Controllers/LoginSurfaceController.cs
~/Models/LoginFormViewModel.cs
~/Views/Homepage.cshtml (making the @Html.Action("Index", "LoginFormSurface") call)
~/Views/LoginSurface/LoginForm.cshtml
If I want to continue with 7.1.0 is there something I could do as a workaround (until fix is out), or should I consider downgrading Umbraco before I get too far vested when we enter content?
I think I figured out why:
@using (Html.BeginUmbracoForm("Login", "LoginSurfaceController", FormMethod.Post, new { id = "loginForm" })) { ... }
I removed the word "Controller" and I hit my breakpoint now. I'm learn'n.
@Jon Bonus info 1: you don't HAVE to call it SomethingSurfaceController, just like in "regular" MVC you can just call it SomethingController and indeed the convention is not to add the Controller suffix in BeginForm or BeginUmbracoForm.
Bonus info 2: you can also do a "typed" BeginUmbracoForm, but then you do need the whole class name (as it is properly typed):
I've fixed the Partials error for 7.1.1 (out soon).
I can't repro the
The model item passed into the dictionary is of type 'Umbraco.Web.Models.RenderModel', but this dictionary requires a model item of type 'mytype'"
thing, not sure what's going on there.My Controller and ViewModel look like this:
In my Layout (
@inherits UmbracoTemplatePage
) I call@Html.Action("Index", "Contact")
And in my Partials folder the Contact view looks like:
After upgrading to 7.1.1 I still received the original error. I just referenced the view differently after moving the views to the Partials folder and done with it.
@Jon I can't understand how the problem would still be there. Are you inheriting from SurfaceController? Are you using NuGet and did you upgrade by doing Update-Package or through the NuGet dialogs in VS?
is working on a reply...