ฉันจะส่งพารามิเตอร์ไปยังมุมมองบางส่วนใน mvc 4 ได้อย่างไร


152

ฉันมีลิงค์เช่นนี้:

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

และเมื่อฉันคลิกที่นี่มันจะเรียกหน้านี้บางส่วน:

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

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

    }
}

หน้า _Profile บางส่วนประกอบด้วย:

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

ตัวอย่าง:

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

ข้อสงสัยของฉันคือฉันจะส่ง "Id" นี้ไปยังส่วน model.parameter ได้อย่างไร

ตัวควบคุมของฉันคือ:

 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
ฉันไม่เข้าใจ บางทีถ้าคุณเพิ่มคอนโทรลเลอร์และแอ็คชั่นของคุณอาจช่วยได้ แต่อย่างที่เขียนไว้ตอนนี้ฉันไม่เข้าใจคำถามของคุณ
เลียม

ดูเกี่ยวกับการขยายบางส่วนใน msdn
Grundy

คำตอบ:


346

คำถามของคุณยากที่จะเข้าใจ แต่ถ้าฉันได้รับส่วนสำคัญคุณก็มีค่าบางอย่างในมุมมองหลักของคุณที่คุณต้องการเข้าถึงในบางส่วนที่แสดงในมุมมองนั้น

หากคุณแสดงผลเพียงบางส่วนด้วยชื่อเพียงบางส่วน:

@Html.Partial("_SomePartial")

มันจะผ่านแบบจำลองของคุณเป็นพารามิเตอร์โดยนัยเช่นเดียวกับถ้าคุณโทร:

@Html.Partial("_SomePartial", Model)

ทีนี้เพื่อให้ส่วนของคุณสามารถใช้สิ่งนี้ได้จริงมันจำเป็นต้องมีโมเดลที่กำหนดไว้เช่น:

@model Namespace.To.Your.Model

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

อีกทางหนึ่งหากคุณกำลังจัดการกับค่าที่ไม่ได้อยู่ในรูปแบบมุมมองของคุณ (อยู่ใน ViewBag หรือค่าที่สร้างขึ้นในมุมมองของตัวเองอย่างใดแล้วคุณสามารถผ่าน ViewDataDictionary

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

แล้ว:

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

เช่นเดียวกับแบบจำลองมีดโกนจะส่งมุมมองของViewDataคุณเป็นค่าปริยายโดยปริยายดังนั้นหากคุณมีViewBag.Idในมุมมองของคุณคุณสามารถอ้างอิงสิ่งเดียวกันในบางส่วนได้


4
หากคุณทำให้โมเดลหลักของคุณใช้อินเตอร์เฟสคุณสามารถให้มุมมองบางส่วนใช้อินเตอร์เฟสนั้นเป็นโมเดล จากนั้นคุณสามารถนำมาใช้ซ้ำได้มากมาย
Jess

@ChrisPratt คำตอบที่อธิบายได้มากเช่นเคย :) โหวตแล้ว
Murat Yıldız

6
ฉันต้องใช้@Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });สิ่งนี้เพื่อทำงานให้ฉัน ฉันใช้ VS2015 DNX 4.5.1 ถ้าใครมีปัญหาเดียวกันนี้
MikeTeeVee

46

หนึ่งในวิธีการที่สั้นที่สุดที่ฉันพบว่ามีค่าเดียวในขณะที่ฉันค้นหาด้วยตัวเองเพียงแค่ผ่านสตริงเดี่ยวและสตริงการตั้งค่าเป็นแบบจำลองในมุมมองเช่นนี้

ในส่วนการโทรบางส่วนของคุณ

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

แล้วผูกโมเดลด้วย Partial View เช่นนี้

@model string

และการใช้ค่าในมุมมองบางส่วนเช่นนี้

@Model

คุณยังสามารถเล่นกับประเภทข้อมูลอื่น ๆ เช่นอาร์เรย์, int หรือชนิดข้อมูลที่ซับซ้อนมากขึ้นเช่น IDictionary หรืออย่างอื่น

หวังว่าจะช่วย


4
นี่มันเรียบร้อย! สิ่งที่ฉันต้องการ ขอบคุณ
Gautam Jain

บางส่วนของฉันไม่ต้องการโมเดลของฉัน แต่ฉันต้องการเก็บทุกสิ่งใน ViewData ModelState ไว้ .. นี่เป็นกลอุบาย ในมุมมองบางส่วนของฉันฉันยังคงสามารถเข้าถึง ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker

สิ่งนี้ยังคงส่งต่อNullReferenceExceptionไปการอ้างอิงวัตถุไม่ได้ถูกตั้งค่าเป็นอินสแตนซ์ของวัตถุมันกำลังบอกว่าModelเป็นโมฆะ ความคิดใด ๆ
facepalm42

15

นี่คือวิธีการขยายที่จะแปลงวัตถุเป็น ViewDataDictionary

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

จากนั้นคุณสามารถใช้มันในมุมมองของคุณเช่น:

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

ไหนดีกว่าnew ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}ไวยากรณ์

จากนั้นในมุมมองบางส่วนของคุณคุณสามารถใช้ViewBagเพื่อเข้าถึงคุณสมบัติจากวัตถุแบบไดนามิกมากกว่าคุณสมบัติที่จัดทำดัชนีเช่น

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

ฉันจะวางToViewDataDictionaryวิธีแบบคงที่นี้ได้ที่ไหน ทุกที่ที่ฉันพยายามจะทำให้ฉันได้รับข้อผิดพลาดของคอมไพเลอร์
Csaba Toth

2
@Csaba ทั้งสองนี้เป็นวิธีการขยาย เพียงวางไว้ในคลาสที่คงที่แล้วอ้างอิงคลาสนั้นในมุมมองของคุณ
Chris Haines

3

สำหรับแกน Asp.Net คุณควรใช้

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

ตัวอย่างเช่น

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.