2012-03-27 63 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