2009-06-04 3 views
5

Ich habe die Kontoerstellungsanzeige und die Anmeldesicht in derselben Ansicht zusammengeführt. Es ist also eine Ansicht mit zwei Formen, aber sie werden gemischt, wenn ich sie einreiche. Wenn ich versuche, mich anzumelden, wird ein Fehler angezeigt:Trennen von zwei Formularen in der gleichen Ansicht in ASP.Net MVC

Html.ValidationSummary() 

beide Formulare erhalten den Fehler. Und ich begann, Felder in loginPassword, createPassword umzubenennen, weil andernfalls, wenn ich einsende und das Passwort fehlt, es auf beiden Seiten als vermisst markiert ist.

Wie könnten diese beiden Formulare getrennt werden, so dass sie unabhängig von derselben Ansicht/Seite arbeiten können?

Antwort

3

ich mit dem gleichen prob zu tun hatte lem. Ich fand, dass es keine Möglichkeit gibt, die Validierungsnachrichten unter Verwendung der eingebauten ValidationSummary() zu trennen. Hier zwei Vorschläge:

  1. Positionieren Sie die Überprüfungszusammenfassung in einem Bereich, in dem sie für beide Formulare gelten könnte. Wenn sich beispielsweise Anmelde- und Anmeldeformulare nebeneinander befinden, positionieren Sie die Validierungszusammenfassung in einem Div, der über beiden Formularen zentriert ist. Ich habe ein Beispiel für diesen Stil auf der Mahalo login page gefunden.
  2. Fügen Sie in den entsprechenden Controller-Aktionsmethoden etwas zu ViewData hinzu, das angibt, welche Aktion aufgerufen wurde. In der Ansicht wird für jedes Formular eine ValidationSummary angezeigt, die jedoch je nach dem, was Sie den ViewData hinzugefügt haben, bedingt wiedergegeben wird.

In beiden Fällen sollten die Formularfelder eindeutig benannt werden.

Ich ging mit Lösung # 1, weil ich mit der Art zufrieden war, wie ich es bekommen konnte, um es zu sehen. Wenn Sie jedoch möchten, dass die Validierungszusammenfassung an zwei verschiedenen Orten angezeigt wird, je nachdem, welches Formular gesendet wurde, gehen Sie zu # 2.

0

Wenn die Formulare in völlig unterschiedlichen Aktionen posten, sollte Ihr ModelStateDictionary nur die Fehler enthalten, die von der Aktion bereitgestellt wurden, die aufgerufen wurde.

Können Sie den entsprechenden Code posten?

+0

Aber Html.ValidationSummary() wählt alle Fehler für jedes Formular aus. – Pablo

+0

In Bezug auf Code können Sie sich nur die Anmeldung ansehen und Kontoaktionen eines frisch erstellten Projekts erstellen. Jetzt habe ich eine logInOrCreateAccount() -Methode, die eine Ansicht mit zwei Formen zeigt, wobei eine auf logIn() und die andere auf createAccount() zeigt. – Pablo

+0

Oh, ich verstehe. Ja, die Validierungszusammenfassung ist nicht formspezifisch. Sie können dies an einer zentralen Stelle oben auf der Seite einfügen oder einfach komplett weglassen. Es wäre nicht schwer, eigene zu schreiben, die entweder ein Präfix haben. –

0

Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, die ValidationSummary() zu teilen.

Für Ihre Formulare können Sie mit den verschiedenen Feldern Modellklassen erstellen, gegen die Sie eine Bindung erstellen würden. Es würde dir jedoch nicht viel über das bringen, was du schon hast.

+0

Ich bin ok mit der Namensänderung, es ist sauber, aber es ist in Ordnung. Es ist der ValidationSummary, an dem ich jetzt nicht arbeiten kann. – Pablo

2

Die Eingabeelemente benötigen andere Namen/IDs, auch wenn sie unterschiedliche Formen haben. Sofern sie nicht unterschiedliche Namen haben, löst sie die Validierungslogik für jedes Steuerelement aus, da sie basierend auf dem Namen des Steuerelements übereinstimmt. Ich denke, dass Sie auf dem richtigen Weg sind, indem Sie die Namen ändern, um sie zu unterscheiden.

Ich würde es gesetzt, mit einer Verbindung Modell, also vielleicht, dass man so etwas tun könnte (man beachte das ist unvollständig):

<%= Html.TextBox("Login.Name") %> 
<%= Html.TextBox("Login.Password") %> 


<%= Html.TextBox("NewAccount.Name") %> 
<%= Html.TextBox("NewAccount.Password") %> 
<%= Html.TextBox("NewAccount.ConfirmPassword") %> 

Auf der Serverseite, verwenden Sie das Präfix Option für das Bindemittel

public ActionResult Login([Bind(Prefix="Login")]AccountModel model) 
{ 
    ... 
} 

Und Ihr Modell würde wie folgt aussehen:

public class AccountModel 
{ 
     public string Name { get; set; } 
     public string Password { get; set; } 
     public string ConfirmPassword { get; set; } 
} 

public class EntryPageModel 
{ 
    public AccountModel Login { get; set; } 
    public AccountModel NewAccount { get; set; } 
} 
+0

Oh! Recht. Ich werde die IDs und Namen anders lassen, noch, ValidationSummary fängt alle in beiden Formen. – Pablo

+0

Ich habe mit einigen Ideen aktualisiert, wie es geht. – tvanfosson

+0

... und ich denke, dass Sie nur eine Validierungszusammenfassung pro Seite benötigen. Ich denke, es soll eine Zusammenfassung aller Fehler im Modellzustandswörterbuch sein. – tvanfosson

5

Ah ja, das musste ich schon mal machen.Die Art und Weise, wie ich das gefunden habe, war, in der ViewData eine Markierung zu setzen, die angibt, welches Formular gepostet wurde, und dann habe ich meine eigene Erweiterungsmethode für ValidationSummary erstellt.

Der Code ist nicht mit mir im Moment, also werde ich mein Bestes tun, um einige Luft-Code dafür jetzt tun, es ist offensichtlich nur ein Konzept, wie es geht, also nehmen Sie es zum Nennwert.

Zum Anfang würde ich das gleiche Setup wie tvanfosson mit seinem 'EntryPageModel' vorgeschlagen verwenden.

View - beachten Html.MyValidationSummary

<% using(Html.BeginForm("NewAccount", "Account")) %> 
<% { %> 
    <%= Html.MyValidationSummary("NewAccountForm") %> 

    <%= Html.TextBox("NewAccount.FirstName") %> 
    <%= Html.TextBox("NewAccount.LastName") %> 
    <%= Html.TextBox("NewAccount.Email") %> 
    <%= Html.Password("NewAccount.Password") %> 
    <%= Html.Password("NewAccount.ConfirmPassword") %> 
<% } %> 

<% using(Html.BeginForm("Login", "Account")) %> 
<% { %> 
    <%= Html.MyValidationSummary("LoginForm") %> 

    <%= Html.TextBox("Login.Email") %> 
    <%= Html.Password("Login.Password") %> 
<% } %> 

-Controller - beachten Viewdata [ "PostedForm"]

public class Account : Controller 
{ 
    private EntryPageModel _viewModel; 

    public ActionResult NewAccount(FormCollection formValues) 
    { 
     try 
     { 
      //binding and validation for _viewModel.NewAccount 
     } 
     catch 
     { 
      ViewData["PostedForm"] = "NewAccountForm"; 
      return View("RegisterAndLogin", _viewModel); 
     } 
    } 

    public ActionResult Login(FormCollection formValues) 
    { 
     try 
     { 
      //binding and validation for _viewModel.Login 
     } 
     catch 
     { 
      ViewData["PostedForm"] = "LoginForm"; 
      return View("RegisterAndLogin", _viewModel); //You'll want to pass in a model 
     } 
    } 
} 

benutzerdefinierte HTML-Erweiterung

namespace System.Web.Mvc 
{ 
    public static class HtmlExtensions 
    { 
     public static string MyValidationSummary(this HtmlHelper html, string formName) 
     { 
      if (!string.IsNullOrEmpty(html.ViewData["PostedForm"]) 
       && (html.ViewData["PostedForm"] == formName)) 
      { 
       return html.ValidationSummary(); 
      } 

      return ""; 
     } 
    } 
} 

HTHS, Charles

+0

Das hätte man in der ValidationSummary() fälschen sollen ... wenn es nur eine Methode gäbe, in der View, also Aufruf von Aktion, zu erkennen, dass ValidationSummary() aufgerufen wurde, dann könnte es ohne explizites Aktionsargument funktionieren! –

+0

Obwohl dies nicht für die Validierung am Client funktioniert, richtig? – Julian

Verwandte Themen