我第一次使用MVC和Razor,希望有一个非常简单的问题。我在网站上有两页。第一页(页面A)有一个非常小的表单,它有一个电子邮件地址的输入。当用户输入自己的电子邮件地址,并点击提交他们使用HttpPost发送到网页B,就像这样:MVC Razor - 如何提交表单本身
@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上提交表单之前。
我知道我在这里错过了一个基本 - 可有人引导我在正确的方向吗?
在此先感谢 铝
UPDATE:要解决这个问题,我已经做了以下。
形式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);
}
你会发现我已经添加了选择WhenRequestContainsKey,我发现在http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html。这意味着只有在请求中有一个字段被称为FullName时,才会调用该代码,在我们的网站上只有一个字段存在于页面B上。
这看起来像我想要的那样工作,但林不知道为什么 - 例如这是否停止验证发生,直到表单被重新发布到页面B上 - 在调用验证方法的方法中没有任何内容?
我实施这个方法有什么问题吗?
感谢 铝
喜帕迪 - 为响应感谢。您的建议存在的问题是,第一个表单会通过输入到文本字段的电子邮件地址传递 - 如果使用重定向,这将会丢失。 – higgsy 2012-03-27 11:10:05
您可以将电子邮件地址弹出到TempData中,并在下一次GET时访问它:http://msdn.microsoft.com/en-us/library/dd394711.aspx(搜索TempData)。 – Paddy 2012-03-27 11:57:48
嗨帕迪 - 我尝试了你的建议。但是,FirstAction现在会生成错误消息“不允许子操作执行重定向操作”。我使用@ Html.Action(“MiniNewsletterSignup”)调用第一个表单 – higgsy 2012-03-28 11:08:00