我第一次使用MVC和Razor,希望这是一个非常简单的问题。我在网站上有两页。第一页(页面A)上有一个非常小的表单,其中包含电子邮件地址的输入。当用户输入他们的电子邮件地址并点击提交时,他们会使用HttpPost发送到页面B,如下所示:
@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和每个字段的验证。问题是我的控制器声明只能使用HttpPost执行NewsletterSignupSend操作。因为页面A上的表单在用户到达页面B时使用了HttpPost,所以验证已经运行 - 即在用户在页面b上提交表单之前。
我知道我在这里错过了一个基本的东西 - 有人能引导我朝着正确的方向前进吗?
提前致谢 人
更新:要解决此问题,我已完成以下操作。
表格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);
}
您会注意到我添加了我在http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html找到的Selector WhenRequestContainsKey。这意味着只有在Request中有一个名为FullName的字段时才会调用此代码,该字段在我们的站点上仅存在于页面B上。
这看起来像我想要的那样工作,但我不知道为什么 - 为什么例如这会阻止验证发生,直到表单被发布回到页面B上 - 方法中没有任何东西调用validate方法? ??
我实施此方法有什么不妥吗?
由于 人
答案 0 :(得分:8)
我认为您错过了一个帖子操作 - 如果您尝试遵循模式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>
}
答案 1 :(得分:2)
在第一个上放[HttpGet]
:
[HttpGet]
public ActionResult NewsletterSignup()
{
var model = new NewsletterSignupModel();
return View(model);
}