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.