Làm thế nào để chuyển các tham số cho một chế độ xem một phần trong ASP.NET MVC?


93

Giả sử rằng tôi có chế độ xem một phần này:

Your name is <strong>@firstName @lastName</strong>

có thể truy cập thông qua hành động chỉ dành cho trẻ em như:

[ChildActionOnly]
public ActionResult FullName(string firstName, string lastName)
{

}

Và tôi muốn sử dụng chế độ xem từng phần này bên trong chế độ xem khác với:

@Html.RenderPartial("FullName")

Nói cách khác, tôi muốn có thể chuyển firstName ans lastName từ chế độ xem sang chế độ xem một phần. Tôi nên làm điều đó như thế nào?


Câu hỏi rất chặt chẽ liên quan: stackoverflow.com/questions/1909134/...
Chris Moschini

Câu trả lời:


77

Sử dụng quá tải này ( RenderPartialExtensions.RenderPartialtrên MSDN ):

public static void RenderPartial(
    this HtmlHelper htmlHelper,
    string partialViewName,
    Object model
)

vì thế:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}

1
Vâng, đã thử điều đó, nhưng tôi nhận được Kết quả phù hợp phương thức quá tải tốt nhất cho 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' có một số lỗi đối số không hợp lệ . Tôi nên triển khai phương thức bộ điều khiển như thế nào? Nó nên có các tham số đầu vào?
Saeed Neamati

18
Vì vậy, bạn đã truyền tham số như thế này, làm thế nào để bạn truy cập nó trong chế độ xem một phần?
Burjua

9
Bạn cũng không cần dấu ngoặc. @Html.Partial()giống @{Html.RenderPartial();}nhưng đẹp hơn nhiều. Họ cũng có quá tải như nhau.
smdrager

7
Làm thế nào để bạn truy cập đối tượng? Model.firstNamevà tương tự của họ ném một ngoại lệobject doesn't have a 'firstName' property
ashes999

4
@ ashes999 bạn có thể truy cập qua ViewData ... nhưng hãy giúp mọi thứ gọn gàng hơn bằng cách chỉ cần tạo một mô hình cụ thể cho cách sử dụng của bạn. Sử dụng nó một lần và một số người có thể coi nó là một lần tung lên, nhưng hãy sử dụng nó nhiều lần hơn thế và đó là điều không cần bàn cãi.
Ted

84

Đây là một cách khác để làm điều đó nếu bạn muốn sử dụng ViewData:

@Html.Partial("~/PathToYourView.cshtml", null, new ViewDataDictionary { { "VariableName", "some value" } })

Và để truy xuất các giá trị được truyền vào:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}

Cảm ơn, câu trả lời của bạn đã thực hiện thủ thuật mà không cần tạo mô hình cho việc này.
alvarodms

Trong số tất cả các ví dụ, đây là ví dụ duy nhất phù hợp với tôi. cảm ơn
BrianLegg

Đây là những gì tôi đang tìm kiếm, không có mô hình. cảm ơn bạn :)
Anupam Roy

Câu trả lời tuyệt vời - nhưng với MVC 4 sử dụng Html.RenderPartial thay vì Html.Partial
Graham Laight

24

Bạn cần tạo một mô hình xem. Một cái gì đó như thế này nên làm ...

public class FullNameViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public FullNameViewModel() { } 

     public FullNameViewModel(string firstName, string lastName)
     {
          this.FirstName = firstName;
          this.LastName = lastName;
     }

}

sau đó từ kết quả hành động của bạn chuyển sang mô hình

return View("FullName", new FullNameViewModel("John", "Doe"));

và bạn sẽ có thể truy cập @Model.FirstName@Model.LastNametheo đó.


13

đảm bảo rằng bạn thêm {} xung quanh Html.RenderPartial, như:

@{Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});}

không phải

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});

1
Định nghĩa của Chế độ xem một phần của bạn trông như thế nào? Khai báo @ model là gì? Ẩn danh của mình ...
Elisabeth

vâng chắc chắn để thêm { }, tôi lãng phí thời gian cho đến khi tôi tìm thấy này bài viết
shaijut

4

Sau đây là cách làm việc cho tôi trên dotnet 1.0.1 :

./ourView.cshtml

@Html.Partial(
  "_ourPartial.cshtml",
  new ViewDataDictionary(this.Vi‌​ewData) {
    {
      "hi", "hello" 
    } 
  }
);

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>

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.