Frage

Yo

ich eine Registrierungsseite auf meiner Seite haben - an der Spitze der Seite ein Anmeldeformular für bestehende Anwender ist. Im Hauptbereich gibt es das Anmeldeformular aus.

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

Die Haupt-Seite, die diese partials beherbergt ist eine Ansicht mit @model ViewModels.RegPageViewModel

Das Ansichtsmodell sieht aus wie:

public class RegViewModel
{
    public RegisterVm RegisterVm { get; set; }
    public LoginVm LoginVm { get; set; }
}

Als ich die Anmeldung Teil der Seite einreichen (es ist Aktion Register / capture - die Empfangs Aktion eine registervm erwartet), um es der Steuerung es beschwert sich über die falsche geführt wird Viewmodel

Was ist der Deal mit Subviews und ihrem Ansichtsmodell? Gibt es einen Standardansatz damit zu tun haben?

Sollte ich eine URL für diese Seite einreichen, die herausfindet, wenn es eine Login-Anfrage oder ein Register Anfrage und dann übernimmt die Post entsprechend? Das scheint chaotisch mir aber ...

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

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: //

War es hilfreich?

Lösung

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

Wenn Sie die Ansicht Code + die VM Klassen gemeinsam nutzen können, dann werden wir besser helfen können.

EDIT:

auf dem Code der Suche ich glaube, Sie sollten die Ansicht Modell Ihre Teilansicht wurden vorbei. Wie zum Beispiel glauben, dass die folgenden Zeilen wie diese sein sollte>

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

Andere Tipps

Nach Ihrer Antwort auf nEEbz:

Sie verwenden:

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

diese in <input name="LoginVM.Email" ...> drehen würde

Beachten Sie die LoginVM. Teil

Ihre Login-Aktion sieht wahrscheinlich wie:

public ActionResult Login(LoginVM model) { }

so es erwartet Feldnamen wie Email und Password, nicht LoginVM.Email und LoginVM.Password.

So Sie Html.Textbox stattdessen verwenden könnten könnten (so dass der Feldname nicht automatisch erstellt wird erhalten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top