2010-12-13 23 views

Trả lời

2

Bạn có thể sử dụng một lĩnh vực tiềm ẩn bên trong các hình thức:

<% using (Html.BeginForm()) { %> 
    <%= Html.HiddenFor(x => x.Id) %> 
    <input type="submit" value="OK" /> 
<% } %> 

hoặc vượt qua nó trong hành động có dạng:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

Nhưng tôi không thể có httpost và httpget với cùng paramets, bạn có thể hiển thị các mẫu cho cs quá? – waldecir

+0

@waldecir, không, bạn không thể có hai hành động điều khiển với cùng một đối số. Bạn sẽ cần phải sửa đổi chữ ký của hành động GET hoặc POST của bạn. –

+0

Có, tôi biết. trang firt của tôi là một nhận được với id để hiển thị các infos về người dùng, vì vậy tôi cần một bài để kích hoạt/hủy kích hoạt, làm thế nào sẽ là cuộc gọi httppost? – waldecir

0

Cách đơn giản nhất cho tình huống đơn giản như vậy là để cho một tên để gửi nút và kiểm tra hành động nếu nó có giá trị hay không. Nếu nó có giá trị, sau đó nó Đăng hành động, nếu không, sau đó nó Get hành động:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %> 
    <input type="submit" value="OK" name="btnActivate" /> 
<% } %> 

Đối với Cs bạn có thể kết hợp được và sau khi điều khiển các phương pháp trong một:

public ActionResult Index(int? id, string btnActivate) 
{ 
     if (!string.IsNullOrEmpty(btnActivate)) 
     { 
      Activate(id.Value); 
      return RedirectToAction("NextAction"); 
     } 

    return View(); 
} 
2

Một hơi muộn cho bên này nhưng tôi thấy một giải pháp dễ dàng hơn cho những gì tôi nghĩ là một trường hợp sử dụng khá phổ biến nơi bạn nhắc GET ("bạn có chắc chắn muốn blah blah blah?") và sau đó hành động trên POST bằng cách sử dụng cùng một đối số.

Giải pháp: sử dụng thông số tùy chọn. Không cần cho bất kỳ lĩnh vực ẩn và như vậy.

Lưu ý: Tôi chỉ thử nghiệm điều này trong MVC3.

public ActionResult ActivateUser(int id) 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult ActivateUser(int id, string unusedValue = "") 
    { 
     if (FunctionToActivateUserWorked(id)) 
     { 
      RedirectToAction("NextAction"); 
     } 
     return View(); 
    } 

Trên lưu ý cuối cùng, bạn không thể sử dụng chuỗi.Empty thay cho "" vì nó phải là một hằng số biên dịch. Và đó là một nơi tuyệt vời để đưa những bình luận hài hước cho người khác để tìm :)

1

Cách tiếp cận của tôi không phải là thêm tham số không sử dụng vì nó có vẻ gây nhầm lẫn và thực hành không tốt. Thay vào đó, những gì tôi làm là thêm "bài" để đặt tên hành động của tôi:

public ActionResult UpdateUser(int id) 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult UpdateUserPost(int id) 
{ 
    // Do work here 
    RedirectToAction("ViewCustomer", new { customerID : id }); 
} 
19

Sử dụng [ActionName] thuộc tính - Bằng cách này bạn có thể có các URL dường như trỏ đến vị trí tương tự nhưng thực hiện hành động khác nhau tùy thuộc vào phương thức HTTP :

[ActionName("Index"), HttpGet] 
public ActionResult IndexGet(int id) { ... } 

[ActionName("Index"), HttpPost] 
public ActionResult IndexPost(int id) { ... } 

Hoặc bạn có thể kiểm tra các phương thức HTTP trong mã:

public ActionResult Index(int id) 
{ 
    if (string.Equals(this.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) 
    { ... } 
} 
Các vấn đề liên quan