Now that we have our URL rewriting in place, it's time to do some real work.
Based on this section's title, you've probably figured out that you're going to
have some post-back issues (if you haven't already tested that out). The
problem with post-back is that, when rendered, the HtmlForm
object
sets the action to the physical page name. Of course, this means that when you
submit the form, your true page is displayed. This is obviously less than ideal
for URL beautification. Not to mention it would most likely confuse your users.
Well, there are two solutions to consider.
First, you can add a simple script block to fix the problem. This is the easiest
solution, but there's one problem: if a user has scripting turned off (as if
that is ever the case, anyway), the fix will be nullified. But, in case you
still like this solution (I do), add this code to your Page
class.
If you don't already, I'd suggest creating a base Page
object for
all of your pages to implement. Then, add this code to the base Page
class. This allows you a good deal of extensibility as far as adding common
features easily.
Register Javascript
RegisterStartupScript( "PostBackFix",
"<script>document.forms[0].action='';</script>" );
Your second option is to extend the HtmlForm
class. This is pretty
simple, as you will see below, but it comes with its own issues. The main
problem that I have with this solution is that you have to explicitly add the
extended HtmlForm
object to replace the default HTML form tag. Not
that it is hard to do, but it can get tedious if you're creating (or
converting) a lot of pages.
Action-less HtmlForm Object
public class ActionlessForm : HtmlForm
{
protected override void RenderAttributes(HtmlTextWriter
writer)
{
Attributes.Add("enctype", Enctype);
Attributes.Add("id", ClientID);
Attributes.Add("method", Method);
Attributes.Add("name", Name);
Attributes.Add("target", Target);
Attributes.Render(writer);
}
}
Each method has it's own pros and cons. They're pretty simple to understand, so
the decision shouldn't be too hard. Honestly, you can implement the second
option through a base Page
class, but that adds a lot more
complexity to your system then you're probably looking for. Explore your
options and be innovative.
Comments