by
26. July 2010 18:51
Consider the following parent page Index.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HomeData>" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<div style="background-color:Red;">
<% Html.RenderAction("SignUp", "Account"); %>
</div>
</body>
</html>
Notice the RenderAction for the following SignUp.ascx page.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SignUpData>" %>
<% using (Html.BeginForm("SignUp", "Account"))
{ %>
<div>
<%: Html.LabelFor(m => m.Email) %>
</div>
<div>
<%: Html.TextAreaFor(m => m.Email) %>
</div>
<div>
<%: Html.ValidationMessageFor(m => m.Email) %>
</div>
<br />
<input type="submit" />
<%} %>
My SignUpData model looks something like this:
public class SignUpData : BaseViewData
{
/// <summary>
/// The email address you are signing up with.
/// </summary>
[DataType(DataType.EmailAddress)]
[Required(ErrorMessage = "Email is required.")]
[StringLength(200, ErrorMessage = "Email must be 200 characters or less.")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")]
[DisplayName("Email Address")]
public string Email
{
get;
set;
}
...
My controller AccountController looks something like this:
[HttpPost]
public ActionResult SignUp(SignUpData data)
{
if (ModelState.IsValid)
{
return View("SignUp", data);
}
return RedirectToAction("Index", "Home", data);
//return View();
}
The problem I have is that although this all renders nicely when i enter an invalid email, it *does* set the ModelState as invalid and if u use Ajax i can get things working nicely.
However, I want this to work on the server too. I'm not sure whether there is NOW any way to pass this invalid model state such that the original Index page (top) is rendered with the RenderPartial called such that the invalid email address state is passed in and rendered - i just don't see the best practice way (sure, i can think of 50 hacks) to get the error information back on the postback (ideally it would work OOTB as it does normally).
I also disable Session state in my applications so i can't use TempData.
by
23. July 2010 02:15
Today I enjoyed a session (technically i'm still listening) by Phil Haack of Microsoft at the Virtual MVC conference discussing MVC 3. He discussed Global Filter providers which will enable you to apply a filter attribute to a number of controllers in pretty much a single line of code. He also showed Conditional Filters which can be used to conditionally apply a filter based on some code check (his example was a check as to whether we were in debug mode).
I have been working with filters today and it solved something i was thinking about today. I like the idea of extending it and i suspect that (and i don't know any more about them than what i saw on the slides) conditional filters *may* solve a number of things i'd like to be able to do.
So I asked a question about using RegEx and patterns with the filters. What I mean by that is being able to read the metadata of the controller classes and methods and being able to apply filters conditionally to them.
For example:
- Apply a trace filter to an methods marked with [HttpPost]
- Apply a debug filter whenever a method in the "AccountController" or "ProfileContoller" is called.
- ... even apply a debug filter whenever a method called "Save" is called in the "AccountController" or "ProfileContoller" is called.
These are some basic examples, but with the ability to apply global filters combined with an ability to read metadata on controllers, methods and so on (and perhaps even the state of the user or application) you can imagine a host of neat filters that could be quickly added to your code.
Further, being able to specify these rules declaratively and using a declarative service locator technique to accomplish DI for your filters could mean it would be super easy to attach filters to your applications without recompiling.