将模型从部分视图传递到控制器
本文关键字:控制器 视图 模型 | 更新日期: 2023-09-27 18:30:21
所以我的部分视图看起来像 -
@model Example.Models.ForgotPasswordViewModel
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div style="font-size: 16px; text-align:center; margin-top:10px;">
@Html.ActionLink("Email Link", "ForgotPassword", "Account")
</div>
作为 asp.net 开箱即用的忘记密码视图的一部分,但我将其转换为部分视图。原始视图包含在"Html.BeginForm(.."中,但我显然不能这样做。(它导致表单中的表单)
如何让它调用帐户控制器的 ForgotPassword 方法,该方法通过传递声明的@model来期望模型?
由 @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) 生成的 Html
:<input class="form-control" id="Email" name="Email" type="text" value="" />
您的帐户控制器的签名。忘记密码(..) :
//
// POST: /Account/ForgotPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByNameAsync(model.Email);
if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
{
// Don't reveal that the user does not exist or is not confirmed
return View("ForgotPasswordConfirmation");
}
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action(
"ResetPassword", "Account",
new { userId = user.Id, code = code },
protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href='"" + callbackUrl + "'">here</a>");
return View("ForgotPasswordConfirmation");
}
// If we got this far, something failed, redisplay form
return RedirectToAction("Index", "Home");
}
此外,正如 Erik 指出的那样,需要确保字段在分部视图中是唯一标识的。该帖子有两次电子邮件。
@ErikPhilips 如何使用jQuery更改表单的目的地? :)
我会将操作链接更改为一个按钮:
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div style="font-size: 16px; text-align:center; margin-top:10px;">
<input type="button"
value="Email Link"
class="change-form-url"
data-url="@Url.Action("ForgotPassword", "Account")"/>
</div>
Jquery:
$(document).ready(funciton()
{
$('.change-form-url').on('click', function()
{
var url = $(this).data('url');
var form = $(this).closest('form');
form.prop('action', url);
form.submit();
});
});
我没有测试过这个,它应该非常接近你想要的。
BeingForm 有一些重载:
@using (Html.BeginForm("ActionName","Controller"))
{
@Html.TextBox("Name");
@Html.Password("Password");
<input type="submit" value="Sign In">
}
将操作名称和控制器名称添加到 beginForm 调用中,您可以覆盖 Post 默认的位置。
我建议您在主窗体之外调用部分视图,以便在一个页面上有两个窗体(不嵌套)。然后,可以将忘记密码模型指向正确的控制器方法。