سؤال

يو

لدي صفحة تسجيل على موقعي - في الجزء العلوي من الصفحة نموذج تسجيل دخول للمستخدمين الحاليين. يوجد في المنطقة الرئيسية نموذج التسجيل.

تسجيل الدخول هو رؤية جزئية مع @model ViewModels.LoginViewModelالتسجيل هو أيضا جزء مع @model ViewModels.RegViewModel

الصفحة الرئيسية التي تضم هذه الجزئية هي وجهة نظر @model ViewModels.RegPageViewModel

يشبه ViewModel هذا:

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

عندما أقوم بإرسال جزء التسجيل في الصفحة (الإجراء هو التسجيل/التقاط - يتوقع إجراء الاستلام سجلًا) إلى وحدة التحكم الخاصة به ، فإنه يشكو من تمريره في ViewModel الخاطئ

ما هي الصفقة مع المشاهدات الفرعية و ViewModel الخاصة بهم؟ هل هناك نهج قياسي للتعامل مع هذا؟

هل يجب أن يكون لدي عنوان 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="@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()
}

وأخيراً سجل controller.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");
        }
    }

دبليو: //

هل كانت مفيدة؟

المحلول

تحتاج إلى التأكد من أن عناصر النموذج (مثل مربع النص وما إلى ذلك) يجب أن يكون لها نفس المعرف مثل خصائص registervm واخذاب. نظريتك صحيحة ، لكنني أعتقد أنك قد ترتكب خطأ في اتفاقية التسمية لـ MVC.

إذا تمكنت من مشاركة رمز العرض الخاص بك + فئات VM ، فسنكون قادرين على المساعدة بشكل أفضل.

تعديل:

بالنظر إلى الكود الخاص بك ، أعتقد أنك يجب أن تمرر نموذج العرض إلى عرضك الجزئي. مثل على سبيل المثال ، يعتقد السطر التالي أن يكون هكذا>

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

نصائح أخرى

وفقا لإجابتك على نيبز:

انت تستخدم:

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 بدلاً من ذلك (بحيث لا يحصل اسم الحقل على autoCreated).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top