MVC Razor - Как подать форму на себя - PullRequest
7 голосов
/ 27 марта 2012

Я впервые использую MVC и Razor, и у меня, как я надеюсь, очень простой вопрос.У меня есть две страницы на сайте.Первая страница (страница A) имеет очень маленькую форму, в которой есть вход для адреса электронной почты.когда пользователь вводит свой адрес электронной почты и нажимает кнопку «Отправить», он отправляется на страницу B с помощью HttpPost, например:

@using (Html.BeginForm("NewsletterSignup","Common", FormMethod.Post))
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}

На странице B есть основная форма, которая позволяет пользователю также ввести свое имя и номер мобильного телефона.число.Контроллер для основной формы выглядит так:

//newsletter signup page
public ActionResult NewsletterSignup()
{
    var model = new NewsletterSignupModel();

    return View(model);
}

[HttpPost, ActionName("NewsletterSignup")]
public ActionResult NewsletterSignupSend(NewsletterSignupModel model)
{
    if (ModelState.IsValid)
    {
        //register the user here
    }

    return View(model);
}

На главной форме у меня есть Validationsummary и проверка для каждого из полей.Проблема в том, что мой контроллер утверждает, что действие NewsletterSignupSend может быть выполнено только с использованием HttpPost.Поскольку форма на странице A использует HttpPost, когда пользователь попадает на страницу B, проверка уже была выполнена, т. Е. До того, как пользователь отправил форму на странице b.

Я знаю, что здесь отсутствует базовый элемент -Может ли кто-нибудь направить меня в правильном направлении?

Заранее спасибо Al

ОБНОВЛЕНИЕ: Для решения этого вопроса я сделал следующее.

Форма A отображается с использованием:

@Html.Action("MiniNewsletterSignup")

Форма A имеет метод контроллера:

//mini newsletter view
        public ActionResult MiniNewsletterSignup()
        {
            var model = new MiniNewsletterSignupModel();

            return View(model);
        }

И содержимое представления:

@model Nop.Web.Models.Common.MiniNewsletterSignupModel
@using (Html.BeginForm("NewsletterSignup", "Common"))
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}

Это отправляет форму с использованием HttpPost на страницуB.

Страница B имеет 2 метода контроллера:

//newsletter signup page
public ActionResult NewsletterSignup()
{
    var model = new NewsletterSignupModel();

    if (Request["email"] != null)
        model.Email = Request["email"];

    return View(model);
}

И:

[HttpPost, **WhenRequestContainsKey("FullName")**]
public ActionResult NewsletterSignup(NewsletterSignupModel model)
{
    if (ModelState.IsValid)
    {
        //process here
    }

    return View(model);
}

Вы заметите, что я добавил Selector WhenRequestContainsKey, который я нашел в http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html. Это означает, что этот код вызывается только тогда, когда в Запросе есть поле с именем FullName, которое на нашем сайте существует только на странице B.

Кажется, это работает так, как я хотел, но я неуверен почему - почему например это останавливает валидациюпроисходит до тех пор, пока форма не будет отправлена ​​обратно на страницу B - в методе, который вызывает метод проверки, нет ничего ???

Что-то не так с тем, как я это реализовал?

СпасибоAl

Ответы [ 2 ]

9 голосов
/ 27 марта 2012

Я думаю, что вы пропустили действие публикации - если вы пытаетесь следовать шаблону GET-POST-Redirect, вам следует избегать этих проблем (т. Е. Каждое сообщение должно перенаправлять на действие GET):

FirstAction()
{
    return View();
}

[HttpPost]
FirstAction()
{
    //Save email address
    return Redirect("NewsletterSignup","Common");
}

И ваша первая форма становится:

@using (Html.BeginForm())
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}
2 голосов
/ 27 марта 2012

Положите [HttpGet] на первый:

[HttpGet]
public ActionResult NewsletterSignup()
{  
    var model = new NewsletterSignupModel();
    return View(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...