Làm cách nào tôi có thể truyền tham số cho chế độ xem một phần trong mvc 4


152

Tôi có một liên kết như thế này:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

và khi tôi nhấp vào nó, nó sẽ gọi trang này một phần:

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

Trang một phần _Profile chứa:

Html.Action("Action", "Controller", model.Paramter) 

Thí dụ:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

Tôi nghi ngờ là làm thế nào tôi có thể chuyển "Id" này cho phần model.parameter ?

Bộ điều khiển của tôi là:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
Tôi không hiểu Có lẽ nếu bạn thêm bộ điều khiển và hành động thì nó có thể giúp ích, nhưng như được viết bây giờ, tôi không hiểu câu hỏi của bạn.
Liam

xem về phần mở rộng một phần trên msd
Grundy

Câu trả lời:


346

Câu hỏi của bạn thật khó hiểu, nhưng nếu tôi nhận được ý chính, bạn chỉ cần có một số giá trị trong chế độ xem chính mà bạn muốn truy cập trong một phần được hiển thị trong chế độ xem đó.

Nếu bạn chỉ hiển thị một phần chỉ với tên một phần:

@Html.Partial("_SomePartial")

Nó thực sự sẽ vượt qua mô hình của bạn như một tham số ngầm, giống như khi bạn gọi:

@Html.Partial("_SomePartial", Model)

Bây giờ, để một phần của bạn thực sự có thể sử dụng điều này, tuy nhiên, nó cũng cần phải có một mô hình được xác định, ví dụ:

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

Ngoài ra, nếu bạn đang xử lý một giá trị không có trong mô hình của chế độ xem của bạn (bằng cách nào đó trong ViewBag hoặc một giá trị được tạo trong chính chế độ xem bằng cách nào đó, thì bạn có thể vượt qua ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

Và sau đó:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

Như với mô hình, Dao cạo mặc định sẽ vượt qua một phần khung nhìn của bạn ViewDatatheo mặc định, vì vậy nếu bạn có ViewBag.Idtrong chế độ xem của mình, thì bạn có thể tham chiếu điều tương tự trong phần của mình.


4
Nếu bạn làm cho mô hình chính của mình triển khai một giao diện, bạn có thể có chế độ xem một phần sử dụng giao diện đó làm mô hình. Sau đó, bạn có thể nhận được rất nhiều tái sử dụng từ nó.
Jess

@ChrisPratt Câu trả lời rất lý giải như mọi khi :) Bình chọn +
Murat Yıldız

6
Tôi đã phải sử dụng @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });cho việc này để làm việc cho tôi. Tôi đang sử dụng VS2015 DNX 4.5.1 nếu có ai khác gặp vấn đề tương tự.
MikeTeeVee

46

Một trong những phương pháp ngắn nhất tôi tìm thấy cho một giá trị trong khi tôi đang tự tìm kiếm, chỉ cần truyền chuỗi đơn và đặt chuỗi làm mô hình theo quan điểm như thế này.

Trong cuộc gọi một phần của bạn

@Html.Partial("ParitalAction", "String data to pass to partial")

Và sau đó ràng buộc mô hình với Chế độ xem một phần như thế này

@model string

và việc sử dụng giá trị của nó trong Chế độ xem một phần như thế này

@Model

Bạn cũng có thể chơi với các kiểu dữ liệu khác như mảng, kiểu dữ liệu int hoặc phức tạp hơn như IDadata hoặc một cái gì đó khác.

Hy vọng nó giúp,


4
Đây là gọn gàng! Chính xác những gì tôi muốn. Cảm ơn.
Gautam Jain

Một phần của tôi không cần mô hình của tôi, nhưng tôi cần phải bảo toàn tất cả các công cụ ModelDate của ViewData .. điều này đã tạo ra mánh khóe. Trong chế độ xem một phần của tôi, tôi vẫn có thể truy cập ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker

Điều này tiếp tục ném một NullReferenceExceptiontham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng, nó nói rằng đó Modellà null. Có ý kiến ​​gì không?
facepalm42

15

Đây là một phương thức mở rộng sẽ chuyển đổi một đối tượng thành ViewDataDipedia.

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

Sau đó, bạn có thể sử dụng nó trong chế độ xem của mình như vậy:

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

Cái nào đẹp hơn new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}cú pháp.

Sau đó, trong chế độ xem một phần của bạn, bạn có thể sử dụng ViewBagđể truy cập các thuộc tính từ một đối tượng động thay vì các thuộc tính được lập chỉ mục, ví dụ:

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

Tôi nên đặt ToViewDataDictionaryphương thức tĩnh này ở đâu? Ở mọi nơi tôi cố gắng đặt nó, tôi gặp một số lỗi trình biên dịch.
Csaba Toth

2
@CsabaToth đây là một phương thức mở rộng. Chỉ cần đặt nó trong một lớp tĩnh và sau đó tham chiếu lớp đó trong chế độ xem của bạn.
Chris Haines

3

Đối với lõi Asp.Net, bạn sử dụng tốt hơn

<partial name="_MyPartialView" model="MyModel" />

Ví dụ

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
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.