2012-03-27 33 views
6

我第一次使用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上 - 在调用验证方法的方法中没有任何内容?

我实施这个方法有什么问题吗?

感谢 铝

回答

2

放一个[HttpGet]放在了第一位:

[HttpGet] 
public ActionResult NewsletterSignup() 
{ 
    var model = new NewsletterSignupModel(); 
    return View(model); 
} 
8

我认为你缺少一个后动作 - 如果你试图遵循的模式GET-POST-重定向你应该避免这些问题(即每一个岗位应该重定向到一个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> 
} 
+0

喜帕迪 - 为响应感谢。您的建议存在的问题是,第一个表单会通过输入到文本字段的电子邮件地址传递 - 如果使用重定向,这将会丢失。 – higgsy 2012-03-27 11:10:05

+0

您可以将电子邮件地址弹出到TempData中,并在下一次GET时访问它:http://msdn.microsoft.com/en-us/library/dd394711.aspx(搜索TempData)。 – Paddy 2012-03-27 11:57:48

+0

嗨帕迪 - 我尝试了你的建议。但是,FirstAction现在会生成错误消息“不允许子操作执行重定向操作”。我使用@ Html.Action(“MiniNewsletterSignup”)调用第一个表单 – higgsy 2012-03-28 11:08:00