Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile error with T4MVC generated code in a MVC 3 project

We are developing a web application with ASP.Net 4 & MVC 3 Framework. I've installed T4MVC through NuGet and all the Views, Controllers and static content are succesfully generated as strong types.

But, when I try to compile the project, it raises an error at generated file T4MVC.cs, which is:

'T4MVC_ViewResultBase.FindView(System.Web.Mvc.ControllerContext)': 
 return type must be 'System.Web.Mvc.ViewEngineResult' to match overridden member
 'System.Web.Mvc.ViewResultBase.FindView(System.Web.Mvc.ControllerContext)'

This is the source code generated:

[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_ViewResultBase : System.Web.Mvc.ViewResultBase,
                                                            IT4MVCActionResult 
{
  public T4MVC_ViewResultBase(string area, string controller, string action):
      base()  {
       this.InitMVCT4Result(area, controller, action);
    }

    protected override void FindView(System.Web.Mvc.ControllerContext context){}

    public string Controller { get; set; }
    public string Action { get; set; }
    public RouteValueDictionary RouteValueDictionary { get; set; }
}

The error says that:

protected override void FindView(System.Web.Mvc.ControllerContext context) { }

should be:

protected override ViewEngineResult 
               FindView(System.Web.Mvc.ControllerContext context) { }

But then it raises another compiling error, as this method should return code.

If we check the base class it inherits from, System.Web.Mvc.ViewResultBase, it actually declares FindView() with ViewEngineResult return type:

public abstract class ViewResultBase : ActionResult
    {
        ...
        protected abstract ViewEngineResult FindView(ControllerContext context);
    }

Has anyone got this error? Has it something to do with MVC version, are we are using MVC 3?

Thanks a lot! Sergi

like image 942
Sergi Avatar asked Apr 06 '11 11:04

Sergi


1 Answers

I think I see the problem, and it is a T4MVC bug. But hopefully it's easy to work around.

Do you have a controller action that is declared to return a ViewResultBase? If so, can you change the return type to be ActionResult? Or alternatively you can change the return type to be whatever the concrete type is that you're returning (e.g. is it ViewResult)?

The T4MVC bug is that it doesn't correctly override non-void methods in ActionResult types.

like image 189
David Ebbo Avatar answered Sep 30 '22 08:09

David Ebbo