2010-11-21 10 views
2

YoAsp.net MVC Razor mehr als eine Form auf einer Seite

ich eine Registrierungsseite auf meiner Seite habe - ganz oben auf der Seite ist ein Anmeldeformular für bestehende Benutzer. Im Hauptbereich befindet sich das Anmeldeformular.

Die Login ist eine Teilansicht mit @model ViewModels.LoginViewModel Die Registrierung ist, ist auch ein teilweise mit @model ViewModels.RegViewModel

Die Hauptseite, die diese partials beherbergt ist eine Ansicht mit @model ViewModels.RegPageViewModel

Das Ansichtsmodell wie folgt aussieht:

Wenn ich den Registrierungsteil der Seite (es ist Aktion ist register/capture - die empfangende Aktion erwartet ein RegisterVm) zu con conmittieren troller beklagt sich über das falsche viewmodel

Was ist der Deal mit Subviews und deren Viewmodel? Gibt es einen Standardansatz, um damit umzugehen?

Sollte ich eine URL für diese Seite haben, die herausfindet, ob es sich um eine Login-Anfrage oder eine Registrierungsanfrage handelt und die Post dann entsprechend behandelt? Das scheint chaotisch mir aber ...

http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs ist so ziemlich das gleiche wie diese)

http://monobin.com/__m69132f76 - RegPageVm.cs

Register.cshtml:

@model xxxx.ViewModels.RegPageVm 
@{ 
    View.Title = "Register"; 
    Layout = "~/Views/Shared/_BareBones.cshtml"; 
} 
<link rel="stylesheet" href="@Url.Content("~/Public/Css/signup.css")" type="text/css" /> 
<div id="sign-up-container"> 
    <div id="sign-up-box"> 
     <div id="sign-up-box-left"> 
      <img src="@Url.Content("~/Public/Images/Signup_176x81.png")" /> 
     </div> 
     <div id="sign-up-box-right"> 
      @Html.Partial("_Register") 
     </div> 
    </div> 
</div> 
<div class="clear"> 
</div> 

_Register.cshtml:

@model xxxx.ViewModels.RegisterVm 

@using (Html.BeginForm("Capture", "Register", FormMethod.Post)) 
{ 
    <table class="sign-up-box-inner"> 
     <tr> 
      <td class="label-area"> 
       @Html.LabelFor(x => x.Email) 
      </td> 
      <td class="field-area"> 
       @Html.TextBoxFor(x => x.Email, new { @class = "login-input", title = "Enter Name" }) 
      </td> 
     </tr> 
     <tr> 
      <td class="label-area"> 
       @Html.LabelFor(x => x.Password) 
      </td> 
      <td class="field-area"> 
       @Html.PasswordFor(x => x.Password, new { @class = "login-input", title = "Enter Name" }) 
      </td> 
     </tr> 
     <tr> 
      <td class="label-area"> 
       @Html.LabelFor(x => x.UserName) 
      </td> 
      <td class="field-area"> 
       @Html.TextBoxFor(x => x.UserName, new { @class = "login-input", title = "Enter Name" }) 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="image" src="../../Public/Images/Submit_150x47.png" class="submit-button" /> 
      </td> 
     </tr> 
    </table> 
    @Html.AntiForgeryToken() 
} 

Und schließlich RegisterController.cs:

public class RegisterController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost, ValidateAntiForgeryToken] 
     public ActionResult Capture(RegisterVm registerVm) 
     { 
      if (!ModelState.IsValid) 
      { 
       return View("index", new RegPageVm() 
       { 
        LoginVm = new LoginVm(), 
        RegisterVm = registerVm 
       }); 
      } 

      return RedirectToAction("index", "Event"); 
     } 
    } 

w: //

+0

Können wir einen Teil des Codes aus der Ansicht sehen? –

+0

sollte es nicht @ Html.Partial sein ("_ Register", Model.RegisterVm)? – neebz

Antwort

3

Sie müssen sicherstellen, dass die Formelemente (wie die Textbox usw.) sollten die gleiche ID wie die registervm und LoginVM Eigenschaften aufweisen. Ihre Theorie stimmt, aber ich denke, Sie könnten einen Fehler in der Namenskonvention von MVC machen.

Wenn Sie Ihren Ansichtscode + die VM-Klassen teilen können, können wir Ihnen besser helfen.

EDIT:

auf dem Code der Suche ich glaube, Sie sollten die Ansicht Modell Ihre Teilansicht wurden vorbei.Wie zum Beispiel glauben, dass die folgende Zeile wie folgt>

@Html.Partial("_Register", Model.RegisterVm)

+0

ich benutze Html.TextBoxFor (x => x.PropertyName) also sollte das aufpassen nein? – iwayneo

+2

Das sollte funktionieren. Wieder können wir Ihren Code sehen; die Aussicht, eine der Teilansichten und das dazugehörige Aussichtsmodell. Möglicherweise besteht ein Problem beim Übergeben des Modells an die Teilansicht. – neebz

+0

war ich ein flid ... – iwayneo

-1

Nach Ihrer Antwort auf nEEbz sein sollte:

Sie verwenden:

Html.TextBoxFor(x=>x.LoginVM.Email) // i guess 

dies würde wiederum in <input name="LoginVM.Email" ...>

Beachten Sie die LoginVM. Teil

Ihre Login-Aktion vermutlich wie folgt aussieht:

public ActionResult Login(LoginVM model) { } 

so erwarten, dass es Feldnamen wie Email und Password, nicht LoginVM.Email und LoginVM.Password.

Sie könnten stattdessen Html.Textbox verwenden (damit der Feldname nicht automatisch erstellt wird).

+0

Die Unteransichten haben @Model ViewModels.LoginViewModel und @Model ViewModels.RegViewModel entsprechend, so dass sie nicht diese Notation verwenden - ich nehme an, dass MVC weiß, die Viewmodel-Hierarchie zu entsprechen - oder Liege ich falsch? Muss ich RenderPartial aufrufen, indem ich den Teil des Ansichtsmodells festlege, der irgendwie verwendet werden soll? – iwayneo

+0

Haben Sie den erstellten HTML-Code überprüft? (Quelltext anzeigen) – Gidon