Asp.net mvc 3 将模型传递给另一个视图
全部, 我是MVC的新手,因此在我从事新项目的过程中学习MVC。我想实现一些简单的功能,但不知道我是否以正确的方式实现了这些功能-当前的方法会导致运行时错误-下面是对问题的描述 我正在尝试创建一些密码重置功能。要重置密码,我将让用户在一个视图中输入用户名和电子邮件。然后在第二个视图中,我将显示他们的密码重置问题,并让他们输入密码重置答案。第二个视图也将显示他们的用户名,因此我需要将输入的用户名从视图一传递到视图二。到目前为止,我有以下两种型号:Asp.net mvc 3 将模型传递给另一个视图,asp.net-mvc-3,Asp.net Mvc 3,全部, 我是MVC的新手,因此在我从事新项目的过程中学习MVC。我想实现一些简单的功能,但不知道我是否以正确的方式实现了这些功能-当前的方法会导致运行时错误-下面是对问题的描述 我正在尝试创建一些密码重置功能。要重置密码,我将让用户在一个视图中输入用户名和电子邮件。然后在第二个视图中,我将显示他们的密码重置问题,并让他们输入密码重置答案。第二个视图也将显示他们的用户名,因此我需要将输入的用户名从视图一传递到视图二。到目前为止,我有以下两种型号: public class ResetPasswor
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.ResetPasswordModelStep2',但是
字典需要类型为的模型项
“MvcCrossPageModel.Models.ResetPasswordModelStepOne”
有人能解释一下我做错了什么吗?有没有更好的方法可以用一个模型在一个视图中实现这一点?创建“第一步”和“第二步”模型是否正确?理想情况下,我希望只有一个视图,用户输入用户名和电子邮件,然后返回相同的视图,提示他们提出秘密问题/每个强类型视图都有一个模型。但你有两种方法。
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);
}
剃刀语法
1.使用此视图。
@模型动力学
任何html
@(使用Html.BeginForm()){
@Html.EditorForModel()
拯救
}
2.使用两个视图
公共操作结果密码ResetStepOne()
{
返回视图();
}
[HttpPost]
公共操作结果密码重置步骤一(重置密码模型步骤一步骤一模型)
{
//假设我正在验证用户是否存在,然后检索
//他们的秘密问题来自知识库
var userSecretQuestion=“您最喜欢的颜色是什么?”;
返回passwordresetstep2(新的resetpasswordmodelstep2{StepOneModel=StepOneModel,ResetQuestion=userSecretQuestion});
}
public ActionResult PasswordResetStepTwo(ResetPasswordModelStepTwo stepTwoModel)
{
返回视图(“NextViewName”,stepTwoModel);
}
密码ResetStepTwo视图的视图模型是什么?步骤二视图的模型是ResetPasswordModelStepTwo。我在这里收到另一个人的评论,建议在PasswordResetStepOne帖子中使用RedirectToAction,并使用TempData将用户名和电子邮件从第一步传递到第二步。我已经这样做了,它工作得很好-虽然我仍然不确定为这个简单的功能使用两个独立的视图是否有意义,但它不能在MVC中用一个视图实现吗?啊,我不知道你可以有@model dynamic-我会这样尝试,然后用用户1304836返回给你-不幸的是,我现在不在家,所以我回家后会尝试一下。这看起来很有希望,谢谢。谢谢-我选择了动态模型选项