我第一次使用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