将模型传递到另一个视图

时间:2012-03-31 09:11:03

标签: asp.net-mvc-3

所有

我是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'。

有人可以解释我在这里做错了吗?有没有更好的方法在一个视图中使用一个模型实现这一目标?我是通过创建“第一步”和“第二步”模型来正确地做到这一点的吗?理想情况下,我想要一个视图,用户输入他们的用户名和电子邮件 - 然后返回相同的视图提示他们的秘密问题/

1 个答案:

答案 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);
    }