Asp.net mvc MVC Razor-如何向自己提交表单
我第一次使用MVC和Razor,有一个非常简单的问题。我在这个网站上有两个页面。第一页(A页)有一个非常小的表单,上面有一个电子邮件地址的输入。当用户输入他们的电子邮件地址并单击submit时,他们将使用HttpPost发送到B页,如下所示:Asp.net mvc MVC Razor-如何向自己提交表单,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我第一次使用MVC和Razor,有一个非常简单的问题。我在这个网站上有两个页面。第一页(A页)有一个非常小的表单,上面有一个电子邮件地址的输入。当用户输入他们的电子邮件地址并单击submit时,他们将使用HttpPost发送到B页,如下所示: @using (Html.BeginForm("NewsletterSignup","Common", FormMethod.Post)) { <p> <input type="text" class="text"
@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>
}
在主窗体上,我有一个Validationsummary和每个字段的validation。问题是,我的控制器声明只能使用HttpPost执行upsend操作。由于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>
}
以及:
您会注意到,我已经添加了选择器WhenRequestContainsKey,这是我在中找到的。这意味着只有当请求中有一个名为FullName的字段时,才会调用此代码,该字段在我们的站点上仅存在于B页上
这似乎是我想要的,但我不知道为什么-例如,为什么这会停止验证,直到表单发布回B页-在方法中没有调用验证方法
我实施这个的方式有什么问题吗
谢谢
Al在第一个上放置一个
[HttpGet]
:
[HttpGet]
public ActionResult NewsletterSignup()
{
var model = new NewsletterSignupModel();
return View(model);
}
我认为您缺少一个post操作-如果您尝试遵循GET post重定向模式,您应该避免这些问题(即每个post都应该重定向到GET操作): 你的第一种形式是:
@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>
}
@使用(Html.BeginForm())
{
}
Hi Paddy-感谢您的回复。您建议的问题是,第一个表单会通过输入到文本字段中的电子邮件地址传递-如果使用重定向,这将丢失。您可以将电子邮件地址弹出到TempData中,并在下一个GET:(搜索TempData)时访问它。嗨,Paddy-我尝试了您的建议。但是,FirstAction现在生成错误消息“不允许子操作执行重定向操作”。我正在使用@Html.Action(“MiniNewslettesSignup”)调用第一个表单。好的,看起来您无法从渲染中重定向:好的,回到我原来的问题。我只希望将一个表单的内容提交给另一个表单,然后在第二个表单中,仅当单击提交按钮时才验证输入-这是我们在经典ASP和.NET中多年来一直在做的事情-当然,这是开发人员一直需要做的事情。有什么想法吗???
[HttpPost, **WhenRequestContainsKey("FullName")**]
public ActionResult NewsletterSignup(NewsletterSignupModel model)
{
if (ModelState.IsValid)
{
//process here
}
return View(model);
}
[HttpGet]
public ActionResult NewsletterSignup()
{
var model = new NewsletterSignupModel();
return View(model);
}
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>
}