質問

私のサイトには登録ページがあります。ページの上部には既存ユーザー用のログイン フォームがあります。メインエリアには登録フォームがあります。

ログインは部分的なビューです。 @model ViewModels.LoginViewModel登録も一部です @model ViewModels.RegViewModel

これらの部分を収容するメイン ページは、次のビューです。 @model ViewModels.RegPageViewModel

このビューモデルは次のようになります。

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

ページの登録部分(アクションは登録/キャプチャです - 受信アクションは RegisterVm を期待します)をコントローラーに送信すると、間違ったビューモデルが渡されたと文句を言います。

サブビューとそのビューモデルはどうなるのでしょうか?これに対処するための標準的なアプローチはありますか?

このページの送信 URL を 1 つ用意して、それがログイン要求なのか登録要求なのかを判断し、それに応じて投稿を処理する必要がありますか?それは私には面倒に思えますが...

http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs はこれとほぼ同じです)

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

登録.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>

_登録.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://

役に立ちましたか?

解決

フォーム要素 (テキストボックスなど) が RegisterVM および LoginVM プロパティと同じ ID を持つようにする必要があります。あなたの理論は正しいですが、MVC の命名規則を間違えている可能性があります。

ビュー コードと VM クラスを共有していただければ、より適切にサポートできるでしょう。

編集:

コードを見ると、ビューモデルを部分ビューに渡す必要があると思います。たとえば、次の行は次のようになるはずです >

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

他のヒント

nEEbzにあなたの答えによるます:

あなたが使用しています:

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

これは<input name="LoginVM.Email" ...>

に変わるだろう

お知らせLoginVM.部分

はあなたのログインアクションは、おそらくのようになります。

public ActionResult Login(LoginVM model) { }

それはEmailPassword、ないLoginVM.EmailLoginVM.Passwordなどのフィールド名を期待してます。

あなたは(フィールド名が自動作成されませんので、ということ)ではなくHtml.Textboxを使用することができますことができるようにます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top