Page Directive Error After Copying Default.aspx From Another Project? - c#

In my web-application (asp.net, C#) in solution explore I copy and paste the default.aspx page which is in the other project. When I run the default.aspx page it is giving error like this
<%# Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="Default" %>
Parser Error Message: Could not load type 'Default'.
Can anyone tell me how to fix this?

In addition to making sure that the class names match, as stated in an earlier answer, there are important differences between the "Codebehind" and "CodeFile" directives. The former, which you're using, is the older, .NET 1.1 way of doing things. In that case, in your code behind you have to declare instances of all of the controls on your page that you need to access, and you shouldn't use partial classes.
For CodeFile, you must use partial classes, and you don't need to declare any of the controls; that work is done for you in the other part of the partial class.
If you're porting an existing page, you need to understand which model it needs, and use the corresponding declarations in both the code behind and the Page directive.

What is the class in your .aspx.cs file? Should be something similar to:
public partial class Default : System.Web.UI.Page
Sometimes it's created as _default

Related

How to duplicate a master page in asp.net

I'm trying to skin a 3rd party asp.net application and don't boast to have any knowledge with MS web technologies.
One page design has a considerably different underlying html structure that can't be achieved with pure css so I need a new master file for this page.
I've naively duplicated a file called Main.Master renamed it Login.Master and changed the reference in the Page file that extends Main.Master to Extend the new master page file, e.g:
<%# Page Language="C#" MasterPageFile="~/Login.Master" EnableViewState="true"
AutoEventWireup="true" Codebehind="Login.aspx.cs" Inherits="xxx.login"
Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>
In Login Master I've not changed a thing, as all the logic should be identical, I just want to change the structure of the HTML.
With the small change mentioned above I get several parser errors along the lines of:
Parser Error Message: The resource object with key 'somekey' was not found.
When I delete the reference to said error, it causes a new parser error further down, and so on and so forth.
I've also tried not having a master page for the page in question but that throws up a whole new collection of errors.
To make things worse, it's on a remote server and I don't have access to visual studio so would prefer a solution that wouldn't require compilation if at all possible.

Where Controls Declarations in a website project are put

I have website i cant access the controls in the code-behind
i drag controls and add them to ASPX file and when i try to access them i cant.
i tried opening the website using:
Visual Studio 2012
Visual Studio 2010
when i even double click on a button it creates its event in the code behind but i still cant access the control!
there is no designer.cs file since this is a web site any idea how to fix it ?
If memory serves, the markup is the designer for a page that lacks a designer file. You can observe this behavior in classic ASP pages that have been ported to .NET.
The compiler simply parses the page, looking for a tag that includes runat="server" and generates a server-side control for it. If there's no ID, one is generated for it. Further, if AutoEventWireup="true" is set at the page level, the events will be automatically connected to these controls, as if by magic. It's all just compiler voodoo, if you ask me, but rather convenient compiler voodoo.
But that's an educated guess, based on experience, and I'm sure someone with far more experience with ASP.NET internals can provide more riveting details. (Jon Skeet, et al.)
Make sure your .aspx file specifies its codebehind file:
<%# Page Title="" Language="C#" CodeFile="YourPage.aspx.cs" Inherits="Content_YourPage" %>
If it is a website then websites don't have designer.
But if you need the designer's then try to convert it to web application

Broken link between aspx and aspx.cs files

I've had the same problem a couple of times with different ASPX pages after renaming them and I am surprised that I can't find someone else with the same problem on stackoverflow.
When I run my ASP.NET C# project, the debugger gives me a message like this one.
Error 5 The name 'txtTitle' does not exist in the current context
It seems that the aspx and aspx.cs files at no longer bound. The only fix I have found for this is to recreate the page and copy/paste my code.
Any idea how to fix this without recreating the whole thing?
Thanks
The code file contains a partial class that is referenced in the ASPX header declaration. Both file name and the actual class in the ASPX header have to match for this to work.
<%# Page Title="TestPage" Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Inherits="TestPage" %>
In your case probably the class name does not match. Check if the class name in the codebehind .cs file matches the name after Inherits.
The concept of partial classes used in ASP.NET is detailed here.
I am surprised at this occurring I regularly rename Silverlight user controls with no harmful side-effects.
Are all of the references to classes being renamed in the aspx page and code behind ?
You might try using this util to relink them.
This can also be caused by the whatever.aspx.designer.vb file being dependent upon whatever.aspx.vb instead of whatever.aspx. If this is the case, it should show incorrectly in the file tree when you expand the group of files in Visual Studio. To fix it, simply exclude the affected files from the project and then re-include them - the faulty project config file should be regenerated and it should now work correctly.
(Same theory for C#.)
I've had the same problem and noticed that sometimes, but not always, the CodeFile setting in the .aspx page is not updated when the class is changed. If this is the same problem you have, you can change it manually:
<%# Page Language="C#" AutoEventWireup="true" CodeFile="MyClass.aspx.cs" Inherits="MyClass" %>
^^^^^^^

ASP 2.0 and partial classes

One of our contractors gave us an ASP.NET 2.0 web site and I'm having a little trouble integrating it into our process. He gave us the project as a zipped directory, no solution file or anything. I can open it in Visual Studio using the Open -> Website option, and the website runs. However, I wanted to set it up as a web application project so that I could add project references to our shared libraries instead of them being linked into the 'bin' directory, and just because I'd prefer to have a regular project really.
I'm running into a weird issue. Let me extract a little code:
HeaderControl.ascx
<%# Control Language="C#" AutoEventWireup="true" CodeFile="HeaderControl.ascx.cs" Inherits="Controls_WebUserControl" %>
HeaderControl.ascx.cs
public partial class Controls_WebUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
Ok, this is a little strange but it seems to be legal at least. The base class has a partial definition in the code-behind (code file?). But then many other controls are defined in the same way, eg
SomeControl.ascx
<%# Control Language="C#" AutoEventWireup="true" CodeFile="SomeControl.ascx.cs" Inherits="Controls_WebUserControl" %>
SomeControl.ascx.cs
public partial class Controls_WebUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
Expectedly, when I try to build my new web application project that I've transferred the files into I get a bunch of errors about the same method being defined in several places. I don't understand why it's not set up with a code behind defining a partial definition of the control class and overriding methods of the base class, but that's sort of beside the point.
What really gets me is this: How does the original work? It runs and it works, so the compiler must be doing something that I don't understand. What happens to the Controls_WebUserControl class?
WHen you change from a web site to a web app, you need to right-click on the project and choose "Convert to Web Application". This should update all the pages.
This is an old link, but I think it's still relevant:
http://webproject.scottgu.com/CSharp/migration2/migration2.aspx
I would say that while the provided site works, it is incorrect.
It works because it is a Web Site project (as opposed to a Web Application Project). Web Site projects do not have a namespace for the web pages; instead it compiles each page separately. In other words, you could say that the class name for the pages is ignored.
It fails when you bring it into a Web Application project because that tries to build a namespace and that fails because of the common class names across the web pages and controls.
I'd right click, select Convert to Web Application, and then fix the class names on the pages & controls. That should get you to where you want to be.
Actually you need to replace CodeFile="SomeControl.ascx.cs" with CodeBehind="SomeControl.ascx.cs"
CodeBehind vs CodeFile

Converting a Page to a User Control

If we want to convert a Page to user control then we should also do the following:
“If you aren’t using the code-behind model, make sure you still include a class name in the Control directive by supplying the ClassName attribute. This way, the web page that consumes the control can be strongly typed, which allows it to access properties and methods you’ve added to the control..”
I’m not sure I understand the above quote:
Namely, if we don’t use code behind class, then ascx class will derive directly from UserControl class!
Thus if we don’t use code behind class, then there won’t be any methods or properties added to a control, so why would web page have problems accessing any of user control’s properties and methods? So why would we need to include a class name in Control directive?
thanx
I think I should clarify how the compilation model works. First of all, you can write everything (including C# code) in a single .ascx file and inherit from whatever class you want to (that ultimately inherits from UserControl) by specifying Inherits attribute (or you might want to omit it) and without a ClassName attribute. If you do this, you can still access the properties from the .aspx file that uses this control. The thing is, you can't use the class in the codebehind file of .aspx page (if it has one) directly. By specifying the ClassName, if you are using the Website project model of Visual Studio, you can access it from the .aspx.cs file too. Note that this would not work in Web application project model as every .cs file will be compiled ahead of the time (prior to the .ascx file). In that case, even ClassName attribute wouldn't help much.
In any case, strictly none of the attributes are necessary. You can always use the properties defined anywhere in .ascx or .ascx.cs file included in a page in the .aspx file (but not always .aspx.cs file).
Edit to address the update to the question:
A) From your source code, it seems you are using the Website model here. Note that I mentioned you cannot use the class directly. I agree this statement might have been a little misleading. What I wanted to note is that without a ClassName, ASP.NET will choose a name for your user control class but that name is not guaranteed. While you can use the generated name, it's not recommended at all. You should treat it pretty much like an anonymous type where you can use an instance but cannot mention a name. In your example, you are basically referencing an instance (which is constructed on the .aspx markup), not the class, which is OK.
B) What you are saying is correct. Whatever you declare in ascx.cs in a Web application will be visible to .aspx.cs and .aspx. What I was talking about is properties that you declare in .ascx in a <script runat="server"> tag. Those will not be visible to .aspx.cs since it's compiled beforehand.
C) ASP.NET will generate the class defined by the ClassName attribute in the ASP namespace. You should use ASP.Some_Name instead. There is one thing I forgot to mention: in this case, you should somehow reference the .ascx in the .aspx markup; either with a Reference directive (<%# Reference Control="MyControl.ascx" %>) directive or with a Register directive (<%# Register TagPrefix="abc" TagName="xyz" Src="MyControl.ascx" %>). This will ensure that the ASP.NET build engine puts the generated .ascx class in the same assembly as .aspx page.
if we don’t use code behind class,
then there won’t be any methods or
properties added to a control, so why
would web page have problems accessing
any of user control’s properties and
methods? So why would we need to
include a class name in Control
directive
You can embed any code behind code in your .ascx/.aspx file, in new asp.net mvc model, there won't be any code behind by default. I think code behind is optional, it's just a nice way to separate one class into two pieces. Partial class is used in code behind.
Even if you don't use code behind class, you can still inherited properties from base control. Then by declaring a class, you will be able to access those properties too.

Categories

Resources