17

I notice with the latest version of ASP.NET MVC that a View no longer defaults to having code-behind classes.

How do I go about adding a code-behind class now to a View or Partial View??

p.campbell
  • 98,673
  • 67
  • 256
  • 322
Andrew Harry
  • 13,773
  • 18
  • 67
  • 102

4 Answers4

23

How to add a Code-behind page to a Partial View

Seems this wasn't particularly tricky, and is quite do-able. This answer worked for a Partial ViewUserControl but the same should apply for a Normal MVC ViewPage as well

  1. Add a new Class file with the convention of <view filename & extention>.cs (i.e. view.ascx.cs)

  2. Add using System.Web.Mvc; to the class

  3. Change the class to Inherit from ViewUserControl<>.
    i.e. public class Foo:ViewUserControl

  4. Add the following to the View's header:

    CodeBehind="View.ascx.cs" Inherits="Project.Views.Shared.View"

  5. Copy the files out of the solution and drag back in to re-associate the two together. This may not be necessary in VS 2010+ and MVC 2+.

For this to work with a normal MVC View, you just need to inherit the class from "ViewPage"

p.campbell
  • 98,673
  • 67
  • 256
  • 322
Andrew Harry
  • 13,773
  • 18
  • 67
  • 102
  • 4
    Thanks for that. I've found a quicker way to associate the two files together is to right-click them, choose Exclude From Project, then with 'Show All Files' selected right-click them again and re-include them. – Andrew Oct 10 '09 at 19:43
  • 3
    VS2010 associates them as soon as you create the class blah.ascx.cs (in the same directory as the aspx page). Awesome. – ashes999 Jan 05 '11 at 01:16
4

I'm not sure why you are creating a code behind file, but if you really really do, then I would consider using the standard webforms approach instead.

I would also look into the basics of MVC to understand why page behinds are not needed.

Another explanation

How to use ASP:Chart without a code-behind (Option B)

Dan Atkinson
  • 11,391
  • 14
  • 81
  • 114
  • 1
    It's quite simple really. I need to use code behind to populate the Chart series i'm using. It wouldn't let me use a normal MVC approach. This is a REAL world compromise, and it works. – Andrew Harry Mar 25 '09 at 23:28
  • In that case, here is how you can use Chart without a code-behind: http://code-inside.de/blog-in/2008/11/27/howto-use-the-new-aspnet-chart-controls-with-aspnet-mvc/ – Dan Atkinson Mar 25 '09 at 23:48
  • So are you telling me you would prefer to have very messy hard to manage spaghetti code in your html? I think this is very valid use of code behind. It is not controller logic, it isn't presentation code. it is presentation preparation. – Andrew Harry Mar 26 '09 at 09:53
  • You don't *have* to put all of that code in the view. It's merely put there to show the user that they don't need to use code-behinds to achieve the same thing. – Dan Atkinson Mar 26 '09 at 17:47
2

Ok, I have verified the solution, here is something that you need to note:

CodeBehind="View.ascx.cs" Inherits="Project.Views.Shared.View"

In your case, you need to change "Project.Views.Shared.View" based on your namespace and classname, and in order to access the control in the code-behind, you have to manually add declaration in code-behind. In my case, I need to initialize the gigaSoft proEssential control:

public class gigaTest2 : ViewUserControl
{
    protected global::Gigasoft.ProEssentials.PegoWeb PegoWeb1;
    protected void Page_Load(object sender, EventArgs e)
    {
        // Set Titles 
        PegoWeb1.PeString.MainTitle = "Hello ASP.NET";
        PegoWeb1.PeString.SubTitle = "";

        // One simple way of passing data, data binding also possible. //' 
        PegoWeb1.PeData.Subsets = 1;
        PegoWeb1.PeData.Points = 6;
        PegoWeb1.PeData.Y[0, 0] = 10;
        PegoWeb1.PeData.Y[0, 1] = 30;
        PegoWeb1.PeData.Y[0, 2] = 20;
        PegoWeb1.PeData.Y[0, 3] = 40;
        PegoWeb1.PeData.Y[0, 4] = 30;
        PegoWeb1.PeData.Y[0, 5] = 50;

        // Set style of chart and a few other properties //' 
        PegoWeb1.PePlot.Method = Gigasoft.ProEssentials.Enums.GraphPlottingMethod.Bar;
        PegoWeb1.PePlot.Option.GradientBars = 8;
        PegoWeb1.PeFont.FontSize = Gigasoft.ProEssentials.Enums.FontSize.Large;
    }
1

To add a codebehind file to your aspx page, while still allowing it to be the target of an MVC view, do the following.

For a view page named Index.aspx...

Replace the following code....

<%@ Page Inherits="System.Web.Mvc.ViewPage" %>

with

<%@ Page CodeFile="Index.aspx.vb" Inherits="Home_Index" %>

Then create a file called Index.aspx.cs (or .vb).

partial class Home_Index : System.Web.Mvc.ViewPage
{...}

or VB

Partial Class Home_Index
    Inherits System.Web.Mvc.ViewPage
    ...
End Class

That's it. The only thing special is using the correct Mvc.ViewPage base class.

Carter Medlin
  • 11,857
  • 5
  • 62
  • 68