2012-03-31 74 views
1

全部,將模型傳遞給另一個視圖

我是MVC的新手,因此在學習新項目時學習了它。我有一些我想實現的簡單功能,但不知道我是否以正確的方式進行操作 - 目前的方法會導致運行時錯誤 - 以下是對問題的描述。

我正在嘗試創建一些密碼重置功能。要重置密碼,我要讓用戶在一個視圖中輸入他們的用戶名和電子郵件。然後在第二個視圖中,我將顯示他們的密碼重置問題,並讓他們輸入密碼重置答案。第二個視圖也會顯示他們的用戶名,所以我需要將輸入的用戶名從視圖1傳遞到視圖2。我有以下兩種模式至今:

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 {用戶名}」這樣的消息,要重置您的密碼,請回答您的密碼重置問題。「我爲上述模型創建了強類型視圖,並執行以下操作。

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強類型的視圖 - 這導致以下運行時錯誤:

The model item passed into the dictionary is of type 'MvcCrossPageModel.Models.ResetPasswordModelStepTwo', but this dictionary requires a model item of type 'MvcCrossPageModel.Models.ResetPasswordModelStepOne'.

有人可以解釋我在做什麼錯嗎?用一種模式在一種視圖中實現這一點有更好的方法嗎?我是否通過創建「第一步」和「第二步」模型來正確執行此操作?理想情況下,我想有一個單一視圖,用戶輸入自己的用戶名和電子郵件 - 那麼同樣的看法返回提示他們輸入密碼提示問題/

+0

什麼視圖模型的PasswordResetSteptTwo看法? – MikeSW 2012-03-31 09:25:06

+0

第二步視圖的模型是ResetPasswordModelStepTwo。我收到了另一個人在這裏提出的意見,建議在PasswordResetStepOne POST中使用RedirectToAction,並使用TempData將用戶名和電子郵件從第一步傳遞到第二步。我已經這樣做了,它工作的很好 - 儘管我仍然不確定這個簡單的功能是否有兩個獨立的視圖是合理的,但是在MVC中只有一個視圖無法實現? – DotNetDeveloper 2012-03-31 09:44:47

回答

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); 
    } 
+0

啊,我不知道你可以有@model的動態 - 我會嘗試這種方式,並返回給你user1304836 - 不幸的是我現在不在家裏,所以當我回家時會試一試。這看起來很有希望,謝謝。 – DotNetDeveloper 2012-03-31 09:47:18

+0

謝謝 - 我去了動態模型選項 – DotNetDeveloper 2012-04-01 07:49:07

+0

我很樂意幫助你! – Lamer 2012-04-01 07:59:19

相關問題