所有
我是MVC的新手,因此在我开始研究新项目的过程中学习它。我有一些我想要实现的简单功能,但不知道我是否采用了正确的方法 - 当前方法导致运行时错误 - 问题描述如下。
我正在尝试创建一些密码重置功能。要重置密码,我将让用户在一个视图上输入用户名和电子邮件。然后在第二个视图中,我将显示他们的密码重置问题,并让他们输入密码重置答案。第二个视图也会显示其用户名,因此我需要将输入的用户名从视图一传递到视图二。到目前为止,我有以下两种型号:
public class ResetPasswordModelStepOne
{
[Required]
[Display(Name = "Username")]
public string Username { get; set; }
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
public class ResetPasswordModelStepTwo
{
public ResetPasswordModelStepOne StepOneModel { get; set; }
[Display(Name = "Question")]
public string ResetQuestion { get; set; }
[Required]
[Display(Name = "Answer")]
public string ResetAnswer { get; set; }
}
请注意,第二个模型还具有存储第一步模型的属性,这样在第二个视图中,我可以在“Hi {Username}”等消息中访问并显示用户用户名,以重置密码,请回答您的密码重置问题。“我为上述两种模型创建了强类型视图,并执行了以下操作。
public ActionResult PasswordResetStepOne()
{
return View();
}
[HttpPost]
public ActionResult PasswordResetStepOne(ResetPasswordModelStepOne stepOneModel)
{
//Imagine i'm validating that the user exists here and then retrieving
//their secret question from a repository
var userSecretQuestion = "What is your favourite color?";
return PasswordResetStepTwo(new ResetPasswordModelStepTwo { StepOneModel = stepOneModel, ResetQuestion = userSecretQuestion });
}
public ActionResult PasswordResetStepTwo(ResetPasswordModelStepTwo stepTwoModel)
{
return View(stepTwoModel);
}
我采用这种方法的问题是,当用户在第一步视图中输入用户名和电子邮件时,我会调用“PasswordResetStepTwo”操作,该操作返回ResetPasswordModelStepTwo的强类型视图 - 这会导致以下结果运行时错误:
传递到字典中的模型项是类型的 'MvcCrossPageModel.Models.ResetPasswordModelStepTwo',但是这个 字典需要类型的模型项 'MvcCrossPageModel.Models.ResetPasswordModelStepOne'。
有人可以解释我在这里做错了吗?有没有更好的方法在一个视图中使用一个模型实现这一目标?我是通过创建“第一步”和“第二步”模型来正确地做到这一点的吗?理想情况下,我想要一个视图,用户输入他们的用户名和电子邮件 - 然后返回相同的视图提示他们的秘密问题/
答案 0 :(得分:2)
every strongly typed views has one model. But you have two ways.
Razor syntax
1.Use this view.
@model dynamic
<div>
any html
@(using Html.BeginForm()){
@Html.EditorForModel()
<button type="submit">save</button>
}
</div>
2. Use two views
public ActionResult PasswordResetStepOne()
{
return View();
}
[HttpPost]
public ActionResult PasswordResetStepOne(ResetPasswordModelStepOne stepOneModel)
{
//Imagine i'm validating that the user exists here and then retrieving
//their secret question from a repository
var userSecretQuestion = "What is your favourite color?";
return PasswordResetStepTwo(new ResetPasswordModelStepTwo { StepOneModel = stepOneModel, ResetQuestion = userSecretQuestion });
}
public ActionResult PasswordResetStepTwo(ResetPasswordModelStepTwo stepTwoModel)
{
return View("NextViewName",stepTwoModel);
}