ASP.Net MVC Cách truyền dữ liệu từ chế độ xem sang bộ điều khiển [đã đóng]


81

Tôi hoàn toàn mới với ASP.Net và tôi chắc chắn đây là một câu hỏi rất cơ bản Tôi có Chế độ xem trong đó có liên kết để tạo báo cáo nhưng để có thể tạo báo cáo, tôi phải yêu cầu người dùng cung cấp tên văn bản phù hợp như tốt.

Cho đến nay, tôi đã có thể truyền dữ liệu từ máy chủ để xem bằng Mô hình được truyền từ bộ điều khiển của tôi để xem, nhưng tôi không chắc chắn về cách Truyền dữ liệu từ chế độ xem sang bộ điều khiển của mình.

Tôi chỉ cần chuyển một chuỗi từ chế độ xem đến bộ điều khiển trong trường hợp này.

Bất kỳ lời khuyên với ví dụ sẽ được đánh giá cao.

CẬP NHẬT

Tôi hiểu rằng tôi phải đăng dữ liệu trở lại máy chủ nhưng làm thế nào điều đó nhận ra ở dạng mã razorhtml và bộ điều khiển?


người dùng phải đăng nội dung nào đó - chế độ xem không trực tiếp biết cách giao tiếp với bộ điều khiển.
Daniel A. White

Nếu bạn đọc tài liệu của Microsoft, bạn sẽ thấy rằng nó KHÔNG giải thích cách thực hiện việc này.
Paul McCarthy

Câu trả lời:


133

Bạn có thể làm điều đó với ViewModels như cách bạn truyền dữ liệu từ bộ điều khiển của mình để xem.

Giả sử bạn có một mô hình xem như thế này

public class ReportViewModel
{
   public string Name { set;get;}
}

và trong GET Action của bạn,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

và chế độ xem của bạn phải được đánh mạnh vào ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

và trong phương thức hành động HttpPost trong bộ điều khiển của bạn

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

HOẶC Đơn giản, bạn có thể làm điều này mà không cần các lớp POCO (Viewmodels)

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

và trong hành động HttpPost của bạn, hãy sử dụng một tham số có cùng tên với tên hộp văn bản.

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

CHỈNH SỬA: Theo nhận xét

Nếu bạn muốn đăng lên bộ điều khiển khác, bạn có thể sử dụng quá tải này của phương thức BeginForm.

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

Truyền dữ liệu từ phương thức hành động để xem?

Bạn có thể sử dụng cùng một mô hình chế độ xem, chỉ cần đặt các giá trị thuộc tính trong phương thức hành động GET của bạn

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

và trong tầm nhìn của bạn

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

Trong tùy chọn / phương pháp 2 mà bạn đã trình bày (không có mô hình) có cách nào để chỉ định tên bộ điều khiển không? bởi vì bộ điều khiển sẽ nhận được yêu cầu bài đăng này khác với bộ điều khiển của chế độ xem này ..
Ahmed

@Ahmed: Kiểm tra câu trả lời đã cập nhật. Bạn có thể sử dụng quá tải cụ thể của phương thức BeginForm.
Shyju

4
xuất sắc, cảm ơn vì câu trả lời tuyệt vời của bạn ..
Ahmed

Tốt, tôi đã tìm kiếm vài giờ rồi. Cảm ơn!
Dan Beaulieu,

Cảm ơn!! Câu trả lời rất rõ ràng. Đối với trường hợp của tôi, trong hành động HttpPost, tôi không cần sử dụng một tham số có cùng tên với tên hộp văn bản. Chỉ đặt đối tượng mô hình làm tham số, tôi có thể lấy các giá trị.
Hnin Htet Htet Aung

27

Trong trường hợp bạn không muốn / cần đăng:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

Lưu ý rằng reportID trong phần {} mới khớp với reportID trong các thông số hành động, bạn có thể thêm bất kỳ số lượng thông số nào theo cách này, nhưng bất kỳ nhiều hơn 2 hoặc 3 (một số sẽ tranh luận luôn), bạn nên chuyển một mô hình qua POST ( theo câu trả lời khác)

Chỉnh sửa : Đã thêm null cho đúng quá tải như được chỉ ra trong nhận xét. Có một số quá tải và nếu bạn chỉ định cả action + controller, thì bạn cần cả routeValues ​​và htmlAttributes. Không có bộ điều khiển (chỉ chú thích + hành động), chỉ cần routeValues ​​nhưng có thể là phương pháp hay nhất để luôn chỉ định cả hai.


4
Chỉ FYI cho bất kỳ ai bắt gặp câu trả lời đơn giản này, thêm giá trị rỗng sau khi bao gồm các giá trị tuyến đường của bạn [new {reportID = 1}], nếu không nó sẽ cố gắng coi chúng là htmlAttributes và chúng sẽ không đi qua,
Hardycore

22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

bộ điều khiển:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}

1
<input type = "valueINeed" type = "text"> nên <input name = "valueINeed" type = "text">
GregH

Thnx. Đã cập nhật phản hồi.
Azure SME
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.