2012-03-27 33 views
6

Tôi đang sử dụng MVC và Razor lần đầu tiên và có hy vọng là một câu hỏi thực sự dễ dàng. Tôi có hai trang trên trang web. Trang đầu tiên (Trang A) có một hình thức rất nhỏ trên đó có một đầu vào cho một địa chỉ email. khi người dùng nhập địa chỉ email của họ và nhấp chuột nộp chúng được gửi đến trang B sử dụng HttpPost, như vậy:MVC Razor - Cách gửi biểu mẫu cho chính mình

@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> 
} 

Ở Trang B có là hình thức chính mà cho phép người dùng cũng có thể nhập tên của họ và số điện thoại di động. Bộ điều khiển cho biểu mẫu chính trông giống như vậy:

//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); 
} 

Trên biểu mẫu chính tôi có một Tóm tắt hợp lệ và xác thực cho từng trường. Vấn đề là contoller của tôi nói rằng hành động NewsletterSignupSend chỉ có thể được thực hiện bằng cách sử dụng HttpPost. Bởi vì biểu mẫu trên Trang A sử dụng HttpPost khi người dùng đến trang B, việc xác thực đã được chạy - tức là trước khi người dùng đã gửi biểu mẫu trên Trang b.

Tôi biết tôi đang thiếu cơ bản ở đây - liệu ai đó có thể chỉ đạo tôi đi đúng hướng không?

Cảm ơn trước Al

UPDATE: Để giải quyết câu hỏi này, tôi đã làm những điều sau đây.

Mẫu A được render sử dụng:

@Html.Action("MiniNewsletterSignup") 

Mẫu A có một phương pháp điều khiển:

//mini newsletter view 
     public ActionResult MiniNewsletterSignup() 
     { 
      var model = new MiniNewsletterSignupModel(); 

      return View(model); 
     } 

Và nội dung của quan điểm là:

@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> 
} 

này submit form sử dụng HttpPost tắt tới Trang B.

Trang B có 2 phương pháp điều khiển:

//newsletter signup page 
public ActionResult NewsletterSignup() 
{ 
    var model = new NewsletterSignupModel(); 

    if (Request["email"] != null) 
     model.Email = Request["email"]; 

    return View(model); 
} 

Và:

[HttpPost, **WhenRequestContainsKey("FullName")**] 
public ActionResult NewsletterSignup(NewsletterSignupModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //process here 
    } 

    return View(model); 
} 

Bạn sẽ nhận thấy tôi đã thêm Selector WhenRequestContainsKey mà tôi tìm thấy ở http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html. Điều này có nghĩa là mã này chỉ được gọi khi có một trường trong Yêu cầu được gọi là Tên đầy đủ, trên trang web của chúng tôi chỉ tồn tại trên Trang B.

Điều này dường như hoạt động như tôi muốn, nhưng tôi không chắc tại sao - tại sao ví dụ điều này có dừng việc xác thực diễn ra cho đến khi biểu mẫu được đăng lại trên Trang B - không có gì trong phương thức gọi một phương thức hợp lệ không?

Có điều gì sai với cách tôi đã triển khai tính năng này không?

Cảm ơn Al

Trả lời

2

Đặt một [HttpGet] trên người đầu tiên:

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

Tôi nghĩ rằng bạn đang thiếu một hành động bài - nếu bạn cố gắng làm theo mô hình GET-POST-Chuyển bạn nên tránh những vấn đề này (tức làmỗi bài nên chuyển hướng đến một hành động GET):

FirstAction() 
{ 
    return View(); 
} 

[HttpPost] 
FirstAction() 
{ 
    //Save email address 
    return Redirect("NewsletterSignup","Common"); 
} 

Và hình thức đầu tiên của bạn trở thành:

@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

Hi Paddy - cảm ơn cho câu trả lời. Vấn đề với đề xuất của bạn là biểu mẫu đầu tiên chuyển qua địa chỉ email được nhập vào trường văn bản - biểu mẫu này sẽ bị mất nếu sử dụng Chuyển hướng. – higgsy

+0

Bạn có thể bật địa chỉ email vào TempData và truy cập vào địa chỉ GET tiếp theo: http://msdn.microsoft.com/en-us/library/dd394711.aspx (tìm kiếm TempData). – Paddy

+0

Hi Paddy - Tôi đã thử những gì bạn đề xuất. Tuy nhiên FirstAction bây giờ tạo ra thông báo lỗi "Hành động con không được phép thực hiện các hành động chuyển hướng." Tôi đang gọi mẫu đầu tiên bằng cách sử dụng @ Html.Action ("MiniNewsletterSignup") – higgsy