页面上的Asp.net MVC剃刀不止一种形式
-
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本页哪个数字,如果它是一个登录请求或注册请求,然后相应地处理这个职位吗?这似乎凌乱我虽然...
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()
}
和最后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");
}
}
瓦特://
解决方案
您需要确保表单元素(如文本框等)应具有相同的id作为RegisterVM和LoginVM性质。你的理论是正确的,但我想你可能会使得在MVC的命名规则是错误的。
如果你可以分享您的视图代码+虚拟机类,那么我们就可以帮助更好。
修改强>
看你的代码,我想你应该可以在视图模型传递给您的局部视图。像例如以下行认为应该是这样>
@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
代替(这样的字段名称没有得到自动创建)。