ViewBags menggunakan @Html.Action untuk merender formulir pada tampilan sebagian

Melihat:

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

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

Tampilan Parsial:

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

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

Pengendali:

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

Saat halaman saya memuat MemberSignup dipanggil dan halaman tersebut ditampilkan

Data Tampilan Induk:

PartialView ViewData: Dari MemberSignup

Kemudian ketika saya mengirimkan formulir pada tampilan sebagian dengan input yang tidak valid sehingga tidak dapat divalidasi dan memanggil CurrentUmbracoPage() dalam tindakan MemberSignupSubmit

Saya mendapatkan yang berikut ini:

ViewData Induk: Dari MemberSignupSubmit

PartialView ViewData: Dari MemberSignup

Jika saya menggunakan @Html.Partial untuk merender tampilan sebagian saya, kedua kantong tampilan menunjukkan nilai yang sama yang ditetapkan dari tindakan pengiriman.

Saya sudah mencoba TempDatatetapi tidak berhasil juga. Apakah benar-benar tidak ada cara untuk mengembalikan apa pun ke tampilan sebagian setelah saya kembali dari tindakan kirim saat menggunakan @Html.Action untuk merender formulir tampilan sebagian.

Masalah keseluruhan yang saya coba selesaikan adalah mengisi dropdown di formulir saya dengan nilai-nilai dari database. Menggunakan @Html.Partial jangan izinkan saya melakukan ini tetapi memiliki viewbag yang berfungsi.


person CodeMonkey    schedule 30.05.2014    source sumber


Jawaban (1)


Saya melakukan ini untuk membuat daftar dropdown dinamis dengan nilai-nilai dari database. Mungkin itu akan membantu seseorang.

Ini adalah pemutar musik yang memerlukan menu berisi db dinamis untuk membuat daftar daftar putar

Saya membuat pengontrol dasar yang diwarisi oleh semua pengontrol lainnya. Di kelas dasar itu, saya memiliki tindakan PlaylistPopupMenu yang mendapatkan daftar playlist dari db.

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

Kemudian saya memiliki tampilan sebagian _PlaylistPopupMenu sebagai berikut:

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

ini menampilkan bagian menu yang dinamis (yaitu daftar putar)

Akhirnya halaman utama memiliki ini untuk membangun bagian menu yang dinamis:

<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
Saya sampai pada kesimpulan yang sama. Perbedaan antara Html.Action dan Html.ActionLink sama dengan Html.Partial vs Html.PartialLink. ActionLink menjadikan semuanya sebagai string HTML. yaitu. kode tidak mendapatkan konteksnya sendiri. Ini juga berarti Anda dapat menggunakan ViewBag di dalam penangan permintaan kirim yang berasal dari tampilan sebagian Anda dan merendernya pada tampilan induk Anda karena dengan ActionLink mereka ada dalam konteks yang sama tidak seperti jika Anda menggunakan Aksi atau Parsial, maka tampilan Parsial akan memilikinya. ViewBag dan konteksnya sendiri. - person CodeMonkey; 01.09.2014