จะส่งพารามิเตอร์ไปยังมุมมองบางส่วนใน ASP.NET MVC ได้อย่างไร


94

สมมติว่าฉันมีมุมมองบางส่วนนี้:

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

ซึ่งสามารถเข้าถึงได้ผ่านการกระทำของเด็กเท่านั้นเช่น:

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

}

และฉันต้องการใช้มุมมองบางส่วนนี้ในมุมมองอื่นด้วย:

@Html.RenderPartial("FullName")

กล่าวอีกนัยหนึ่งฉันต้องการที่จะส่งต่อ firstName ans lastName จากมุมมองไปยังมุมมองบางส่วน ฉันควรทำอย่างไร?


คำถามที่เกี่ยวข้องกันมาก: stackoverflow.com/questions/1909134/…
Chris Moschini

คำตอบ:


78

ใช้โอเวอร์โหลดนี้ ( RenderPartialExtensions.RenderPartialบน MSDN ):

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

ดังนั้น:

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

1
พยายามแล้ว แต่ฉันได้รับวิธีที่ดีที่สุดที่จับคู่กับ 'System.Web.WebPages.WebPageExecutingBase.Write (System.WebWebPages.HelperResult)' มีข้อผิดพลาดอาร์กิวเมนต์ที่ไม่ถูกต้อง ฉันควรใช้วิธีการควบคุมอย่างไร ควรมีพารามิเตอร์อินพุตหรือไม่?
Saeed Neamati

19
คุณส่งพารามิเตอร์แบบนี้แล้วคุณจะเข้าถึงในมุมมองบางส่วนได้อย่างไร
Burjua

9
คุณไม่จำเป็นต้องใช้วงเล็บ @Html.Partial()เหมือนกับ@{Html.RenderPartial();}แต่สวยกว่ามาก พวกเขามีโอเวอร์โหลดเหมือนกัน
smdrager

7
คุณเข้าถึงวัตถุได้อย่างไร? Model.firstNameและพวกเขาชอบโยนข้อยกเว้นว่าobject doesn't have a 'firstName' property
ashes999

4
@ ashes999 คุณสามารถเข้าถึงผ่าน ViewData ... แต่ช่วยให้สิ่งต่างๆเป็นระเบียบเรียบร้อยเพียงแค่สร้างโมเดลเฉพาะสำหรับการใช้งานของคุณ ใช้ครั้งเดียวและบางคนอาจคิดว่าเป็นการโยนทิ้ง แต่ใช้มากกว่านั้นและไม่ใช่เกมง่ายๆ
Ted

85

นี่เป็นอีกวิธีหนึ่งที่ทำได้หากคุณต้องการใช้ ViewData:

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

และเพื่อดึงค่าที่ส่งผ่าน:

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

ขอบคุณคำตอบของคุณทำให้เคล็ดลับโดยไม่ต้องสร้างแบบจำลองสำหรับสิ่งนี้
alvarodms

จากตัวอย่างทั้งหมดนี่เป็นเพียงตัวอย่างเดียวที่ได้ผลเต็มที่สำหรับฉัน ขอบคุณ
BrianLegg

นี่คือสิ่งที่ฉันกำลังมองหาไม่มีแบบจำลอง ขอบคุณ :)
Anupam Roy

คำตอบที่ดีเยี่ยม - แต่ด้วย MVC 4 ให้ใช้ Html.RenderPartial แทน Html.Partial
Graham Laight

25

คุณต้องสร้างโมเดลมุมมอง เรื่องแบบนี้ควรทำ ...

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

}

จากนั้นผลการกระทำของคุณจะผ่านแบบจำลอง

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

และคุณจะสามารถเข้าถึง@Model.FirstNameและ@Model.LastNameตามนั้น


14

ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม {} รอบ ๆ Html.RenderPartial เป็น:

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

ไม่

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

1
ความหมายของ Partial View ของคุณมีลักษณะอย่างไร? คำประกาศ @model คืออะไร? ไม่ระบุชื่อ ...
Elisabeth

ใช่ให้แน่ใจว่าจะเพิ่ม{ }ฉันเสียเวลาจนกว่าฉันพบนี้บทความ
shaijut

5

สิ่งต่อไปนี้ใช้งานได้สำหรับฉันบนdotnet 1.0.1 :

./ourView.cshtml

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

./_ourPartial.cshtml

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.