Asp.net MVC Razor มากกว่าหนึ่งรูปแบบในหนึ่งหน้า

Yo

ฉันมีหน้าลงทะเบียนบนเว็บไซต์ของฉัน - ที่ด้านบนของหน้าคือแบบฟอร์มการเข้าสู่ระบบสำหรับผู้ใช้ที่มีอยู่ ในบริเวณหลักจะมีแบบฟอร์มลงทะเบียน

การเข้าสู่ระบบเป็นมุมมองบางส่วนด้วย @model ViewModels.LoginViewModel การลงทะเบียนเป็นมุมมองบางส่วนด้วย @model ViewModels.RegViewModel

หน้าหลักซึ่งมีบางส่วนเหล่านี้คือมุมมองที่มี @model ViewModels.RegPageViewModel

วิวโมเดลนี้ดูเหมือนว่า:

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

เมื่อฉันส่งส่วนการลงทะเบียนของเพจ (การกระทำคือการลงทะเบียน/การจับภาพ - การดำเนินการที่ได้รับคาดว่าจะมี RegisterVm) ไปยังตัวควบคุม มันบ่นว่าถูกส่งผ่านโมเดลมุมมองที่ไม่ถูกต้อง

การจัดการกับมุมมองย่อยและโมเดลมุมมองของพวกเขาคืออะไร มีแนวทางมาตรฐานในการจัดการกับสิ่งนี้หรือไม่?

ฉันควรมี URL ส่งหนึ่งรายการสำหรับหน้านี้ซึ่งระบุว่าเป็นคำขอเข้าสู่ระบบหรือคำขอลงทะเบียนแล้วจัดการโพสต์ตามนั้นหรือไม่ มันดูยุ่งสำหรับฉันแม้ว่า ...

http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs ค่อนข้างจะเหมือนกับสิ่งนี้)

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

Register.cshtml:

@model xxxx.ViewModels.RegPageVm
@{
    View.Title = "Register";
    Layout = "~/Views/Shared/_BareBones.cshtml";
}
<link rel="stylesheet" href="/[email protected]("~/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()
}

และสุดท้าย 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://


person Community    schedule 21.11.2010    source แหล่งที่มา
comment
เราสามารถดูโค้ดบางส่วนจาก View ได้หรือไม่?   -  person Matthew Abbott    schedule 21.11.2010
comment
ไม่ควรจะเป็น @Html.Partial(_Register, Model.RegisterVm) ใช่ไหม   -  person neebz    schedule 21.11.2010


คำตอบ (2)


คุณต้องตรวจสอบให้แน่ใจว่าองค์ประกอบของฟอร์ม (เช่น กล่องข้อความ ฯลฯ) ควรมี ID เดียวกันกับคุณสมบัติ RegisterVM และ LoginVM ทฤษฎีของคุณถูกต้อง แต่ฉันคิดว่าคุณอาจทำผิดพลาดในการตั้งชื่อ MVC

หากคุณสามารถแชร์โค้ดมุมมอง + คลาส VM ได้ เราก็จะสามารถช่วยเหลือได้ดียิ่งขึ้น

แก้ไข:

เมื่อดูโค้ดของคุณ ฉันคิดว่าคุณควรส่งโมเดลมุมมองไปยังมุมมองบางส่วนของคุณ เช่น บรรทัดต่อไปนี้เชื่อว่าควรเป็นเช่นนี้ >

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

person neebz    schedule 21.11.2010
comment
ฉันใช้ Html.TextBoxFor(x=›x.PropertyName) ดังนั้นจึงควรดูแลเรื่องนั้นใช่ไหม - person ; 21.11.2010
comment
นั่นควรจะได้ผล เราจะเห็นรหัสของคุณอีกครั้ง มุมมอง หนึ่งในมุมมองบางส่วนและโมเดลมุมมองที่สอดคล้องกัน อาจมีปัญหาบางอย่างในการส่งแบบจำลองไปยังมุมมองบางส่วน - person neebz; 21.11.2010

ตามคำตอบของคุณต่อ nEEbz:

คุณกำลังใช้:

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

นี่จะกลายเป็น <input name="LoginVM.Email" ...>

สังเกตส่วน LoginVM.

การเข้าสู่ระบบของคุณอาจมีลักษณะดังนี้:

public ActionResult Login(LoginVM model) { }

ดังนั้นจึงคาดหวังชื่อฟิลด์เช่น Email และ Password ไม่ใช่ LoginVM.Email และ LoginVM.Password

ดังนั้นคุณสามารถใช้ Html.Textbox แทนได้ (เพื่อไม่ให้สร้างชื่อฟิลด์โดยอัตโนมัติ)

person Gideon    schedule 21.11.2010
comment
มุมมองย่อยมี @model ViewModels.LoginViewModel และ @model ViewModels.RegViewModel ตามลำดับเพื่อไม่ให้ใช้สัญลักษณ์นั้น - ฉันสมมติว่า mvc รู้ว่าจะจับคู่ลำดับชั้นของ viewmodel - หรือฉันผิด? ฉันจำเป็นต้องเรียก RenderPartial โดยระบุส่วนของ viewmodel ที่จะใช้หรือไม่? - person ; 21.11.2010
comment
คุณได้ตรวจสอบ HTML ที่สร้างขึ้นแล้วหรือยัง? (ดูแหล่งที่มา) - person Gideon; 22.11.2010