Asp.net MVC Razor ページ上の複数のフォーム
-
26-09-2019 - |
質問
よ
私のサイトには登録ページがあります。ページの上部には既存ユーザー用のログイン フォームがあります。メインエリアには登録フォームがあります。
ログインは部分的なビューです。 @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) { }
それはEmail
とPassword
、ないLoginVM.Email
とLoginVM.Password
などのフィールド名を期待してます。
あなたは(フィールド名が自動作成されませんので、ということ)ではなくHtml.Textbox
を使用することができますことができるようにます。