WebAppication project doesn't like separate codefiles

  • Thread starter Thread starter cmrchs
  • Start date Start date
C

cmrchs

Hi,

I have in my web application project (VS.NET 2008) :
- a webform (webform2.aspx, webform2.aspx.cs,
webform2.aspx.designer.cs)
- a code-file Product.cs.

But i can't use the definition of 'Product' nowhere in my page-class-
file (webform2.aspx.cs)

For example:

protected void Page_Load(object sender, EventArgs e)
{
Product p = new Product();
}

the compiler doesn't know the definition of Product

whereas if I place the definition of Product in the same codefile as
the WebForm.cs then it works.

How can i make it work just by keeping each class definition in its
own codefile?
By the way, what happened to the App_Code used in 2005?

thank you
Chris
 
Hi,

I have in my web application project (VS.NET 2008) :
- a webform (webform2.aspx, webform2.aspx.cs,
webform2.aspx.designer.cs)
- a code-file Product.cs.

But i can't use the definition of 'Product' nowhere in my page-class-
file (webform2.aspx.cs)

For example:

protected void Page_Load(object sender, EventArgs e)
{
Product p = new Product();
}

the compiler doesn't know the definition of Product

whereas if I place the definition of Product in the same codefile as
the WebForm.cs then it works.

How can i make it work just by keeping each class definition in its
own codefile?
By the way, what happened to the App_Code used in 2005?

If App_Code isn't there its because it hasn't been created yet. App_Code is
where your Product.cs should be. I would recommend you use a namespace as
well the word 'Product' is fairly common.
 
I concur with App_Code, if not in its own assembly. If that is not to your
liking, make sure you have the proper namespace referenced in your code
behind/beside file.

--
Gregory A. Beamer
MVP, MCP: +I, SE, SD, DBA

Subscribe to my blog
http://gregorybeamer.spaces.live.com/lists/feed.rss

or just read it:
http://gregorybeamer.spaces.live.com/

********************************************
| Think outside the box! |
********************************************
 
I concur with App_Code, if not in its own assembly. If that is not to your
liking, make sure you have the proper namespace referenced in your code
behind/beside file.

--
Gregory A. Beamer
MVP, MCP: +I, SE, SD, DBA

Subscribe to my bloghttp://gregorybeamer.spaces.live.com/lists/feed.rss

or just read it:http://gregorybeamer.spaces.live.com/

********************************************
| Think outside the box! |

hello,

actually I previously put the code in App_Code, but even then it
doesn't work !
Only when I use it inline it works, but not when placed in the code-
behind file ???

So, the following works:
<script runat="server">
void Button1_Click(object sender, EventArgs e)
{
Product c = new Product();
Label1.Text = c.GetMyMessage(TextBox1.Text);
}
</script>

but not in the code-behind file, how come?

why doesn't it work the 'normal' way, I mean with the code-files in
the same directory as the aspx-file (it works like that in WinForms)
Or is there a way?

thank you
 
Do you have a line like this, to import the code-behaind class ?

<%@ Page Language="C#" AutoEventWireup="false" CodeFile="some.aspx.cs" Inherits="_some" %>




Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
Do you have a line like this, to import the code-behaind class ?

<%@ Page Language="C#" AutoEventWireup="false" CodeFile="some.aspx.cs" Inherits="_some" %>

Juan T. Llibre, asp.net MVP
asp.net faq :http://asp.net.do/faq/
foros de asp.net, en español :http://asp.net.do/foros/
======================================

hello,

yes i do ... in the webApp-directory I have a file
BindingToDataAccessLayer.aspx starting with
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="BindingToDataAccessLayer.aspx.cs"
Inherits="WebForm1" %>

in BindingToDataAccessLayer.aspx.cs I have:

using Products; // --> COMPILER ERROR: namespace name could not
be found
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Product p = new Product(); // --> COMPILER ERROR
}
}


for the rest of my project structure:

In App_Code i have Product.cs

namespace Products
{
public class Product
{ ...}
}

it just doesn't make sense to me
any suggestions?

Chris
 
re:
!> in the webApp-directory I have a file BindingToDataAccessLayer.aspx starting with:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="..." Inherits="WebForm1" %>

Please recheck that the Class in "BindingToDataAccessLayer.aspx.cs" is actually named "WebForm1".

VS 2008 follows this type of class naming syntax in code-behind files:

In default.aspx.cs, the code-behind page for Default.aspx...
public partial class _Default : System.Web.UI.Page

Notice the underscore, and notice that the page's class
is named for the page name, with an underscore added.

It looks to me like like renamed an aspx page, but did not change the class name in the code-behind.

The IDE does not automatically change the class name for you if you rename a file.
If you ask me, I think it should... :-)

In any case, for a page named "BindingToDataAccessLayer.aspx.cs",
this is the default syntax the IDE uses when creating the page and its code-behind class:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="BindingToDataAccessLayer.aspx.cs"
Inherits="_BindingToDataAccessLayer" %>

Your class can be named anything you want to,
but the Inherits statement must point to the correct class name.




Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
Do you have a line like this, to import the code-behaind class ?

<%@ Page Language="C#" AutoEventWireup="false" CodeFile="some.aspx.cs" Inherits="_some" %>

Juan T. Llibre, asp.net MVP
asp.net faq :http://asp.net.do/faq/
foros de asp.net, en español :http://asp.net.do/foros/
======================================

hello,

yes i do ... in the webApp-directory I have a file
BindingToDataAccessLayer.aspx starting with
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="BindingToDataAccessLayer.aspx.cs"
Inherits="WebForm1" %>

in BindingToDataAccessLayer.aspx.cs I have:

using Products; // --> COMPILER ERROR: namespace name could not
be found
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Product p = new Product(); // --> COMPILER ERROR
}
}


for the rest of my project structure:

In App_Code i have Product.cs

namespace Products
{
public class Product
{ ...}
}

it just doesn't make sense to me
any suggestions?

Chris
 
Also, the upper-case "D", C# being case-sensitive...


Indeed. I've been caught out with that on more than one occasion... :-)


I agree or, at the very least, pop a warning to say that there is now a
"mismatch" (for want of a better term) between the class name specified in
the page's @Page directive and the actual partial class specified in its
associated code-behind file...

the class has the same name as specified by inherits

in BindingToDataAccessLayer.aspx I have:

<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="BindingToDataAccessLayer.aspx.cs"
Inherits="WebForm1" %>

and in BindingToDataAccessLayer.aspx.cs I have:

public partial class WebForm1 : System.Web.UI.Page
{ }

if the 2 didn't match, suppose I define WebForm2 in the code behind
file but leave Inherits="WebForm1", I'd get an error in the browser
anyway when starting up
--> 'WebForm1' is not allowed here because it does not extend
class 'System.Web.UI.Page'.

I'm running out of options :-((

any suggestions?

Chris
 
What happens if you fully qualify the class name :

Inherits="YourNamespace.WebForm1"

?

i.e., if your namespace is named WebApp :

Inherits="WebApp.WebForm1"

This should do it IF you are using a namespace in your codebehind...which you should, anyway :

namespace WebApp
{
public partial class WebForm1 : System.Web.UI.Page






Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
the class has the same name as specified by inherits

in BindingToDataAccessLayer.aspx I have:

<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="BindingToDataAccessLayer.aspx.cs"
Inherits="WebForm1" %>

and in BindingToDataAccessLayer.aspx.cs I have:

public partial class WebForm1 : System.Web.UI.Page
{ }

if the 2 didn't match, suppose I define WebForm2 in the code behind
file but leave Inherits="WebForm1", I'd get an error in the browser
anyway when starting up
--> 'WebForm1' is not allowed here because it does not extend
class 'System.Web.UI.Page'.

I'm running out of options :-((

any suggestions?

Chris

Okay, this may be a totally useless suggestion, especially since
you're using in VS 2008, and my experience is with VS 2005, but...
Are you sure the product class is being compiled?
When I did a WebApplication in VS2005, and put classes in App_Code, I
had a problem where I simply could not see them in the rest of the
program. Even if I moved them to the root, I still couldn't see them.
I finally introduced deliberate syntax errors into the class, and then
did a Build, and the errors were not caught, thus convincing myself
that the files were not being included in the build.

I think the problem turned out to be (again, this may not apply to VS
2008) if you click a .cs file in the Solution explorer and look at the
Properties page for it, the first line there is "Build Action". For
the files I created in App_Code, it was set to "Content" instead of
"Compile", and it remained that way even if I moved the file.

Hope I didn't waste your time, but it might be worth looking at.
 
Also, the upper-case "D", C# being case-sensitive...


Indeed. I've been caught out with that on more than one occasion... :-)


I agree or, at the very least, pop a warning to say that there is now a
"mismatch" (for want of a better term) between the class name specified in
the page's @Page directive and the actual partial class specified in its
associated code-behind file...

no difference :-(

There was no namespace so it wasn't necessary but I've defined the
class in a namespace now

namespace MyNs
{
public partial class WebForm1 : System.Web.UI.Page
{
}
}

Inherits="MyNs.WebForm1"

but still nothing :-(

anyway ... as the best design still is a separate controlLib for each
tier-component I think I'll leave it at that. unless you have another
option ?

i was just curious about this App_Code thing but as you can imagine,
I'm not impressed at all by that functionality..
my experience with it? a waste of time.
what is supposed the benefit of it?
I can only use my product-class when using it in inline script in the
aspx-file, so why come up then with the idea of code-behind in the
first place?

Chris
 
re:
!> i was just curious about this App_Code thing but as you can imagine,
!> I'm not impressed at all by that functionality..

Quite frankly, I'm not too impressed with it, either, primarily from a security viewpoint.
Uploading raw code to a server isn't a very secure approach to programming.

Also, there's no problems like the one you're encountering.

re:
!> I can only use my product-class when using it in inline script in the aspx-file,
!> so why come up then with the idea of code-behind in the first place?

I've evolved a personal preference which skirts the issues :

I compile assemblies with my helper classes ( my DAL layer ) from the command-line,
and place the resulting assembly in the /bin directory.

It's quite easy then to import my namespace with

<%@ Import Namespace="DataObjects" %>

....and instantiating the SQLDATA class is uncomplicated with :

Dim RS as New SQLDATA()

It works 100% of the time with no fuss.

I'd recommend ( depending on your time availability )
you dump what you're doing now...and create your own Data Access Layer (DAL).

Here's two pages with sample code which will help you get that done quickly :

http://msdn.microsoft.com/en-us/library/aa581778.aspx

http://weblogs.asp.net/scottgu/archive/2006/01/15/435498.aspx




Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
re:
!> i was just curious about this App_Code thing but as you can imagine,
!> I'm not impressed at all by that functionality..

Quite frankly, I'm not too impressed with it, either, primarily from a security viewpoint.
Uploading raw code to a server isn't a very secure approach to programming.

Also, there's no problems like the one you're encountering.

re:
!> I can only use my product-class when using it in inline script in the aspx-file,
!> so why come up then with the idea of code-behind in the first place?

I've evolved a personal preference which skirts the issues :

I compile assemblies with my helper classes ( my DAL layer ) from the command-line,
and place the resulting assembly in the /bin directory.

It's quite easy then to import my namespace with

<%@ Import Namespace="DataObjects" %>

...and instantiating the SQLDATA class is uncomplicated with :

Dim RS as New SQLDATA()

It works 100% of the time with no fuss.

I'd recommend ( depending on your time availability )
you dump what you're doing now...and create your own Data Access Layer (DAL).

Here's two pages with sample code which will help you get that done quickly :

http://msdn.microsoft.com/en-us/library/aa581778.aspx

http://weblogs.asp.net/scottgu/archive/2006/01/15/435498.aspx

Juan T. Llibre, asp.net MVP
asp.net faq :http://asp.net.do/faq/
foros de asp.net, en español :http://asp.net.do/foros/
======================================

thank you!

Chris
 
Juan T. Llibre said:
re:
!> i was just curious about this App_Code thing but as you can imagine,
!> I'm not impressed at all by that functionality..

Quite frankly, I'm not too impressed with it, either, primarily from a security viewpoint.
Uploading raw code to a server isn't a very secure approach to programming.

Also, there's no problems like the one you're encountering.

re:
!> I can only use my product-class when using it in inline script in the aspx-file,
!> so why come up then with the idea of code-behind in the first place?

I've evolved a personal preference which skirts the issues :

I compile assemblies with my helper classes ( my DAL layer ) from the command-line,
and place the resulting assembly in the /bin directory.

It's quite easy then to import my namespace with

<%@ Import Namespace="DataObjects" %>

...and instantiating the SQLDATA class is uncomplicated with :

Dim RS as New SQLDATA()

It works 100% of the time with no fuss.

I'd recommend ( depending on your time availability )
you dump what you're doing now...and create your own Data Access Layer (DAL).

Here's two pages with sample code which will help you get that done quickly :

http://msdn.microsoft.com/en-us/library/aa581778.aspx

http://weblogs.asp.net/scottgu/archive/2006/01/15/435498.aspx

Can't say I've ever seen these problems myself. App_Code has always worked
IMO experience and thats across quite a number of clients. Unless you are
being really fussy with strong names etc being App_Code is no less secure
than the bin directory. I don't put any of my code there myself but
customers use it. Its easy and 'fudgeable' (there is no need to build dlls
to make a minor tweak).

So far I have found the code that starts off in App_Code migrates to the bin
once it has been established.
 
re:
!> App_Code is no less secure than the bin directory

I'll take a strong exception to that...

re:
!> I don't put any of my code there myself

Why ?

re:
!> So far I have found the code that starts off in App_Code
!> migrates to the bin once it has been established.

Sure, it does, but your source code also stays in App_Code
where any two-bit programmer in your organization can see it.

I prefer to not upload source code...and obfuscate my assemblies.
Ymmv...




Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
Juan T. Llibre said:
re:
!> App_Code is no less secure than the bin directory

I'll take a strong exception to that...

Why? Do you think it isn't true?
re:
!> I don't put any of my code there myself

Why ?

I just don't ;)
re:
!> So far I have found the code that starts off in App_Code
!> migrates to the bin once it has been established.

Sure, it does, but your source code also stays in App_Code
where any two-bit programmer in your organization can see it.

We don't employ two-bit programmers. Besides a two-bit programmer can still
manage to compile a dll and drop it in the bin.
 
re:
!>>> App_Code is no less secure than the bin directory
!>> I'll take a strong exception to that...
!> Why? Do you think it isn't true?

Anthony, you're rationalizing insecure procedures.

Name me *one* programmer who prefers to place raw source code
a server...and I'll show you a severely complacent person who's likely
to get the jolt of his life when his precious code is lifted.

re:
!>>> I don't put any of my code there myself
!>> Why ?
!> I just don't ;)

So, you *do* agree with me.

re:
!> Besides a two-bit programmer can still manage to compile a dll and drop it in the bin

Where the code will be a lot safer than if uploaded raw.



Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
Juan T. Llibre said:
re:
!>>> App_Code is no less secure than the bin directory
!>> I'll take a strong exception to that...
!> Why? Do you think it isn't true?

Anthony, you're rationalizing insecure procedures.

Name me *one* programmer who prefers to place raw source code
a server...and I'll show you a severely complacent person who's likely
to get the jolt of his life when his precious code is lifted.

re:
!>>> I don't put any of my code there myself
!>> Why ?
!> I just don't ;)

So, you *do* agree with me.

re:
!> Besides a two-bit programmer can still manage to compile a dll and drop it in the bin

Where the code will be a lot safer than if uploaded raw.

I think we're talking at cross purposes. I hadn't considered that by
security you were refering to protecting your source code as an asset. I
was thinking of security in terms of a black hat doing something malicious
to site. If such a person has access to the App_Code they have access to
the bin and in fact the whole site.

Still there are times when source isn't particularly valueable as an asset
and its accessibility to customers (by customer I mean duely authorised
personnel who are employed by the organisation that commissioned the work)
has value.
 
re:
!> I hadn't considered that by security you were
!> referring to protecting your source code as an asset.

Yes, I was.

re:
!> Still there are times when source isn't particularly valueable as an asset

Yes, there are such times.

For application developers who deploy their apps to their client's servers,
though, ( and there's tons of those ), it's far better for them not to deploy
raw code to the App_Code directory.

Otherwise, they're just giving their knowledge away to cut-and-paste ops.






Juan T. Llibre, asp.net MVP
asp.net faq : http://asp.net.do/faq/
foros de asp.net, en español : http://asp.net.do/foros/
======================================
 
Back
Top