Bagaimana cara melewatkan parameter ke tampilan parsial di ASP.NET MVC?


94

Misalkan saya memiliki pandangan parsial ini:

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

yang dapat diakses melalui tindakan khusus anak seperti:

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

}

Dan saya ingin menggunakan tampilan parsial ini di dalam tampilan lain dengan:

@Html.RenderPartial("FullName")

Dengan kata lain, saya ingin melewatkan firstName dan lastName dari tampilan ke tampilan parsial. Bagaimana saya harus melakukan itu?


Pertanyaan yang sangat terkait: stackoverflow.com/questions/1909134/…
— Chris Moschini

Jawaban:


78

Gunakan kelebihan ini ( RenderPartialExtensions.RenderPartialdi MSDN ):

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

begitu:

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

1
Ya, sudah mencobanya, tetapi saya mendapatkan kecocokan metode kelebihan beban terbaik untuk 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' memiliki beberapa kesalahan argumen yang tidak valid . Bagaimana cara menerapkan metode pengontrol? Haruskah itu memiliki parameter input?
— Saeed Neamati

19
Jadi Anda melewatkan parameter seperti ini, bagaimana Anda mengaksesnya dalam tampilan parsial?
— Burjua

9
Anda juga tidak membutuhkan tanda kurung. @Html.Partial()sama @{Html.RenderPartial();}tapi jauh lebih cantik. Mereka juga memiliki kelebihan yang sama.
— smdrager

7
Bagaimana Anda mengakses objek? Model.firstNamedan sejenisnya mengeluarkan pengecualian bahwaobject doesn't have a 'firstName' property
— ashes999

4
@ ashes999 Anda dapat mengakses melalui ViewData ... tetapi membantu menjaga hal-hal tetap rapi hanya dengan membuat model khusus untuk penggunaan Anda. Gunakan sekali dan beberapa orang mungkin menganggapnya gagal, tetapi gunakan lebih dari itu dan itu tidak perlu dipikirkan.
— Ted

85

Berikut cara lain untuk melakukannya jika Anda ingin menggunakan ViewData:

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

Dan untuk mengambil nilai yang diteruskan:

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

Terima kasih, jawaban Anda berhasil tanpa membuat model untuk ini.
— alvarodms

Dari semua contoh, ini adalah satu-satunya yang berhasil bagi saya. terima kasih
— BrianLegg

Ini yang saya cari, tidak ada model. terima kasih :)
— Anupam Roy

Jawaban yang sangat baik - tetapi dengan MVC 4 gunakan Html.RenderP Partial bukan Html.P Partial
— Graham Laight

25

Anda perlu membuat model tampilan. Sesuatu seperti ini harus dilakukan ...

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

}

kemudian dari hasil tindakan Anda meneruskan model

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

dan Anda akan dapat mengakses @Model.FirstNamedan @Model.LastNamekarenanya.


14

pastikan Anda menambahkan {} di sekitar Html.RenderP Partial, seperti:

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

tidak

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

1
Bagaimana definisi Tampilan Parsial Anda terlihat? Apa itu deklarasi @model? Anonim ...
— Elisabeth

ya pastikan untuk menambahkan { }, saya membuang waktu sampai saya menemukan artikel ini
— shaijut

5

Berikut ini bekerja untuk saya di dotnet 1.0.1 :

./ourView.cshtml

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

./_ourP Partial.cshtml

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.