Передача модели в другой вид - PullRequest
1 голос
/ 31 марта 2012

Все,

Я новичок в MVC и поэтому изучаю его по мере работы над новым проектом.У меня есть несколько простых функций, которых я хотел бы достичь, но не знаю, правильно ли я это делаю - текущий подход приводит к ошибке времени выполнения - описание проблемы приведено ниже.

I 'Я пытаюсь создать некоторые функции сброса пароля.Чтобы сбросить пароль, я собираюсь заставить пользователя ввести свое имя пользователя и адрес электронной почты в одном представлении.Затем, во втором представлении, я собираюсь отобразить их вопрос сброса пароля и заставить их ввести свой ответ сброса пароля.Во втором представлении также будет отображаться имя пользователя, поэтому мне нужно передать введенное имя пользователя из первого представления во второе.На данный момент у меня есть следующие две модели:

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; }
}

Обратите внимание, что вторая модель также имеет свойство для хранения модели первого шага, так что на втором экране я могу получить доступ и отобразить пользователейимя пользователя в сообщении типа «Привет {Имя пользователя}, чтобы сбросить пароль, пожалуйста, ответьте на вопрос сброса пароля».Я создал строго типизированные представления для обеих вышеупомянутых моделей и выполняю следующие действия:

    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 Ответ

2 голосов
/ 31 марта 2012
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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...