ViewBags ใช้ @Html.Action เพื่อเรนเดอร์ฟอร์มในมุมมองบางส่วน

ดู:

<p>Parent ViewData: @ViewData["Test"]</p>   

@Html.Action("MemberSignup","MemberSignupSurface")

มุมมองบางส่วน:

<p>PartialView ViewData: @ViewData["Test"]</p>  

@using (Html.BeginUmbracoForm<MemberSignupSurfaceController>
    ("MemberSignupSubmit", "MemberSignupSurfaceController",FormMethod.Post))
{
    <!-- Some form controls -->
    <input type="submit" value="Signup" />
}

ตัวควบคุม:

public class MemberSignupSurfaceController : SurfaceController
{
    public ActionResult MemberSignup()
    {
        ViewData["Test"] = "From MemberSignup";
        // Do database stuff and create model from that
        return PartialView("MemberSignupView", model);
    }


    [HttpPost]
    public ActionResult MemberSignupSubmit(MemberViewModel model)
    {
        ViewData["Test"] = "From MemberSignupSubmit";

        if (ModelState.IsValid)
        {
             // Redirect to success using TempData
        }
        else
        {
            return CurrentUmbracoPage();
        }                                            
    }       
}

เมื่อโหลดเพจของฉัน MemberSignup ถูกเรียกและเพจแสดง

ข้อมูลมุมมองหลัก:

ViewData บางส่วน: จาก MemberSignup

เมื่อฉันส่งแบบฟอร์มในมุมมองบางส่วนโดยมีอินพุตที่ไม่ถูกต้อง ดังนั้นมันจะไม่ตรวจสอบและเรียก CurrentUmbracoPage() ในการดำเนินการ MemberSignupSubmit

ฉันได้รับสิ่งต่อไปนี้:

ข้อมูลมุมมองหลัก: จาก MemberSignupSubmit

ViewData บางส่วน: จาก MemberSignup

หากฉันใช้ @Html.Partial เพื่อแสดงผลมุมมองบางส่วน ถุงมองทั้งสองจะแสดงค่าเดียวกันที่ตั้งไว้จากการดำเนินการส่ง

ฉันได้ลอง TempDataแต่มันก็ไม่ได้ผลเหมือนกัน ไม่มีทางที่จะส่งสิ่งใดกลับไปยังมุมมองบางส่วนได้จริงๆ หลังจากที่ฉันกลับจากการดำเนินการส่งเมื่อใช้ @Html.Action เพื่อแสดงแบบฟอร์มมุมมองบางส่วน

ปัญหาโดยรวมที่ฉันพยายามแก้ไขคือการเติมดรอปดาวน์ในแบบฟอร์มของฉันด้วยค่าจากฐานข้อมูล การใช้ @Html.Partial ไม่อนุญาตให้ฉันทำสิ่งนี้ แต่มี viewbag ที่ใช้งานได้


person CodeMonkey    schedule 30.05.2014    source แหล่งที่มา


คำตอบ (1)


ฉันทำสิ่งนี้เพื่อแสดงรายการดรอปดาวน์แบบไดนามิกพร้อมค่าจากฐานข้อมูล บางทีมันอาจจะช่วยใครบางคนได้

เป็นเครื่องเล่นเพลงที่ต้องการเมนูฐานข้อมูลแบบไดนามิกเพื่อแสดงรายการเพลย์ลิสต์

ฉันสร้างคอนโทรลเลอร์พื้นฐานซึ่งคอนโทรลเลอร์อื่นทั้งหมดสืบทอดมา ในคลาสพื้นฐานนั้น ฉันมีแอคชั่น PlaylistPopupMenu ซึ่งรับรายการเพลย์ลิสต์จากฐานข้อมูล

    public PartialViewResult PlaylistPopupMenu()
    {
        try
        {
            return PartialView("_PlaylistPopupMenu", db.GetPlaylists(1).ToList());
        }
        catch (Exception)
        {
            throw;
        }
    }

จากนั้นฉันมีมุมมองบางส่วน _PlaylistPopupMenu ดังนี้:

@model List<OneMusic.Models.GetPlaylists_Result>
@if (Model.Count > 0)
{
    <li style="height:2px" class="divider"></li>
    foreach (var item in Model)
    {
        <li style="height:30px">@Html.DisplayFor(p => item.Name)
            @Html.ActionLink(item.Name, "AddSong", "Playlist", new { playlistId =       @item.PlaylistId, songId = 1 }, "") 
       </li>
    }
}

สิ่งนี้ทำให้ส่วนไดนามิกของเมนู (เช่นเพลย์ลิสต์)

ในที่สุด หน้าหลักก็มีสิ่งนี้เพื่อสร้างส่วนไดนามิกของเมนู:

<ul class="dropdown-menu" style="margin-top:10px"><p class="text-primary" style="margin-left:18px; margin-top:6px">Add To</p>

    <!-- other static menu items here-->

    <li style="margin-top:-60px; height:0px">@Html.Action("PlaylistPopupMenu")</li>
</ul>
person AndrewJE    schedule 27.08.2014
comment
ฉันก็มาถึงข้อสรุปเดียวกัน ความแตกต่างระหว่าง Html.Action และ Html.ActionLink เหมือนกับ Html.Partial vs Html.PartialLink ActionLink แสดงผลสิ่งทั้งหมดเป็นสตริงของ HTML เช่น. รหัสไม่ได้รับบริบทของตัวเอง นอกจากนี้ยังหมายความว่าคุณสามารถใช้ ViewBag ภายในตัวจัดการคำขอส่งที่มาจากมุมมองบางส่วนของคุณและให้แสดงผลบนมุมมองหลักของคุณเนื่องจากด้วย ActionLink พวกเขามีอยู่ในบริบทเดียวกันซึ่งแตกต่างจากที่คุณใช้ Action หรือบางส่วน ดังนั้นมุมมองบางส่วนจะมี ViewBag และบริบทของตัวเอง - person CodeMonkey; 01.09.2014