views:

41

answers:

0

In my little app I've a strongly typed partial view (the Login Form) this is rendered within the Masterpage, this looks as follows:

          <!-- Login Box -->
          <div class="login">
            <div class="login-bg clearingfix">
              <% Html.RenderPartial("LoginViewControl", Model); %>
            </div>
          </div>
          <!-- / Login Box -->

The Model of this partial view is:

using System;
using System.Web;
using System.ComponentModel.DataAnnotations;

using mpws.Util.Validation;

    namespace mpws.Models
    {
        public class LoginViewModel
        {
            [Required]
            public string UserName { get; set; }

            [Required]
            public string Password { get; set; }

        }
    }

And the View itself contains a Validationsummary: <%= Html.ValidationSummary() %>

I created another View called SignUp, also this is strongly typed with the type as follows:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

using mpws.Util.Validation;

namespace mpws.Models
{
    public class SignUpViewModel
    {
        [Required]
        public string UserName { get; set; }

        [Required]
        public string Password { get; set; }

        [Required]
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        [Required]
        public string EmailAddress { get; set; }

        [Required]
        public string EmailAddressRepeat { get; set; }

        public string Occupation { get; set; }

        public string SuggestedBy { get; set; }

        public IValidationState validationState { get; set; }

    }
}

here my SignUp View:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<mpws.Models.SignUpViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    SignUp
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>SignUp</h2>

<div id="SignUpForm">
    <% using (Html.BeginForm("SignUp","Account", new mpws.Models.SignUpViewModel())) {%>
        <%: Html.ValidationSummary() %>

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                <%: Html.Resource("Strings, Username") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.UserName) %>
                <%: Html.ValidationMessageFor(model => model.UserName) %>
            </div>

            <div class="editor-label">
                <%: Html.Resource("Strings, Password") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Password) %>
                <%: Html.ValidationMessageFor(model => model.Password) %>
            </div>

            <div class="editor-label">
                <%: Html.Resource("Strings, FirstName") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.FirstName) %>
                <%: Html.ValidationMessageFor(model => model.FirstName) %>
            </div>

            <div class="editor-label">
                <%: Html.Resource("Strings, LastName") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.LastName) %>
                <%: Html.ValidationMessageFor(model => model.LastName) %>
            </div>

            <div class="editor-label">
                <%: Html.Resource("Strings, EmailAddress") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.EmailAddress) %>
                <%: Html.ValidationMessageFor(model => model.EmailAddress) %>
            </div>

            <div class="editor-label">
                <%: Html.Resource("RepeatEmailAddress") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.EmailAddressRepeat) %>
                <%: Html.ValidationMessageFor(model => model.EmailAddressRepeat) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Occupation) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Occupation) %>
                <%: Html.ValidationMessageFor(model => model.Occupation) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.SuggestedBy) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.SuggestedBy) %>
                <%: Html.ValidationMessageFor(model => model.SuggestedBy) %>
            </div>

            <p>
                <button class="button positive" type="submit"> 
                      <img alt="" src="<%= ResolveUrl("~/Content/public/ui/button/tick.png") %>" /> 
                      <%: Html.Resource("Strings, SignUp") %>   
                </button>
                <button class="button negative" type="reset"> 
                      <img alt="" src="<%= ResolveUrl("~/Content/public/ui/button/cross.png") %>" /> 
                      <%: Html.Resource("Strings, Cancel") %>  
                </button>
            </p>
        </fieldset>

    <% } %>    
</div>

</asp:Content>

and the login partial View:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<mpws.Models.LoginViewModel>" %>

<!-- This should be outsourced into it own .js fila -->
<script type="text/javascript">
    /// <reference path="jquery-1.4.1-vsdoc.js" />

    $(document).ready(function () {
        $('#LoginForm form').live('submit', function () {
            $.post($(this).attr('action'), $(this).serialize(), function (result) {
                if ($.isString(result)) {
                    $("#LoginForm").replaceWith($(result));
                }
                else if (result["Successfull"]) {
                    window.location.href = result["RedirectUrl"];
                }
                else {
                    alert('Unknown Error...');
                }
            });
            return false;
        });
    });

    jQuery.isString = function (o) {
        return (typeof o === "string");
    }
</script>

<div id="LoginForm">
    <% using (Html.BeginForm("SignIn", "Account"))
       {%>

        <fieldset>
            <legend>Login</legend>
            <%if(!ViewContext.ViewData.ModelState.IsValid) {%>
                <%= Html.ValidationSummary_jQueyUIfriendly() %>

                <%= Html.ValidationSummary() %>
                <br />  
            <%} %>

            <div class="editor-label">
                <%: Html.Resource("Strings, Username") %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.UserName)%> <br />
                <%: Html.ValidationMessageFor(model => model.UserName)%>
            </div>

            <div class="editor-label">
                <%: Html.Resource("Strings, Password") %>
            </div>
            <div class="editor-field">
                <%: Html.PasswordFor(model => model.Password)%><br />
                <%: Html.ValidationMessageFor(model => model.Password)%>
            </div>
            <p>
                <button class="button positive" type="submit"> 
                      <img alt="" src="<%= ResolveUrl("~/Content/public/ui/button/tick.png") %>" /> 
                      <%: Html.Resource("Strings, SignIn") %>
                 </button>
            </p>
        </fieldset>

    <% } %>
</div>

Well if now someone clicks the "SignUp"-Submitbutton, the validation errors are shown in the validationsummary of the signUp view but also in the validationsummary of the partial view "LoginViewControl"... Any idea why? I thought maybe the Modelstate is globally handeld but if I click the "login"-Submitbutton the validation Messages are only shown in the partial view...

Any idea?

Thanks in advance Johannes