Я впервые использую 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