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?

Saeed Neamati
sumber
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});
}
David Wick
sumber
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;
}
Garry English
sumber
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.

simonlchilds
sumber
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});
BlackTigerX
sumber
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>
danau
sumber
1

Hanya:

@Html.Partial("PartialName", Model);
Cássio Batista Pereira
sumber