Saya ingin memiliki 2 model dalam satu tampilan. Halaman berisi keduanya LoginViewModel
dan RegisterViewModel
.
misalnya
public class LoginViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RegisterViewModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
Apakah saya perlu membuat ViewModel lain yang menampung 2 ViewModels ini?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
Saya perlu atribut validasi untuk dibawa ke tampilan. Inilah sebabnya saya membutuhkan ViewModels.
Apakah tidak ada cara lain seperti (tanpa BigViewModel
):
@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Name)
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
@model ViewModel.LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
asp.net-mvc
asp.net-mvc-3
Shawn Mclean
sumber
sumber
ViewBag
untuk masing-masing tampilan, berfungsi dengan baik@
di depan nama mereka, seperti yang saya lakukan di sini.Jawaban:
Ada banyak cara ...
dengan BigViewModel Anda, Anda melakukannya:
Anda dapat membuat 2 tampilan tambahan
Login.cshtml
dan register.cshtml hal yang sama
setelah penciptaan Anda harus merendernya di tampilan utama dan memberikannya viewmodel / viewdata
jadi bisa seperti ini:
atau
menggunakan bagian ajax dari situs web Anda menjadi lebih mandiri
iframes
, tapi mungkin ini bukan masalahnyasumber
@Html.RenderAction
melaporkan kesalahan bahwa Ekspresi harus mengembalikan nilaiSaya akan merekomendasikan menggunakan
Html.RenderAction
dan PartialViewResults untuk mencapai ini; itu akan memungkinkan Anda untuk menampilkan data yang sama, tetapi setiap tampilan parsial masih akan memiliki model tampilan tunggal dan menghilangkan kebutuhan untukBigViewModel
Jadi tampilan Anda mengandung sesuatu seperti berikut:
Di mana
Login
&Register
kedua tindakan di controller Anda didefinisikan seperti berikut:The
Login
&Register
kemudian akan kontrol pengguna yang berada baik dalam View folder saat ini, atau dalam folder Bersama dan ingin sesuatu seperti ini:/Views/Shared/Login.cshtml: (atau /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (atau /Views/MyView/Register.cshtml)
Dan di sana Anda memiliki tindakan pengontrol tunggal, melihat dan melihat file untuk setiap tindakan dengan masing-masing tindakan yang benar-benar berbeda dan tidak bergantung satu sama lain untuk apa pun.
sumber
RenderAction
. Saya selalu lupa bagiannya dari paket berjangka karena proyek saya selalu menyertakan dll itu secara default. Yang benar-benar hingga preferensi dan persyaratan aplikasi untuk apakah siklus MVC tambahan layak pemisahan yang diberikannya pada sisi desain. Banyak kali Anda dapat men-cacheRenderAction
hasil sehingga satu-satunya hit yang Anda ambil adalah sedikit pemrosesan ekstra melalui pabrik pengontrol.Cara lain adalah dengan menggunakan:
Saya telah menjelaskan cara menggunakan metode ini baik dalam tampilan dan pengontrol untuk contoh lain: Dua model dalam satu tampilan di ASP MVC 3
Dalam kasus Anda, Anda bisa menerapkannya menggunakan kode berikut:
Dalam tampilan:
Perhatikan bahwa saya telah secara manual mengubah atribut Name untuk setiap properti ketika membangun formulir. Ini perlu dilakukan, jika tidak maka tidak akan bisa dipetakan dengan benar ke parameter model tipe ketika nilai dikirim ke metode terkait untuk diproses. Saya akan menyarankan menggunakan metode terpisah untuk memproses formulir ini secara terpisah, untuk contoh ini saya menggunakan metode Login1 dan Login2. Metode Login1 harus memiliki parameter bertipe RegisterViewModel dan Login2 memerlukan parameter bertipe LoginViewModel.
jika diperlukan actionlink, Anda dapat menggunakan:
dalam metode controller untuk tampilan, variabel tipe Tuple perlu dibuat dan kemudian diteruskan ke tampilan.
Contoh:
atau Anda dapat mengisi dua instance dari LoginViewModel dan RegisterViewModel dengan nilai dan kemudian meneruskannya ke tampilan.
sumber
EditorFor
atauHiddenFor
(yang idealnya ingin saya gunakan) properti model tidak diatur ketika metodeLogin1
/Login2
controller dipanggil. Agaknya@Name=
pemetaan itu diabaikan. ApakahHiddenFor
memerlukan beberapa trik lain untuk situasi ini?Gunakan model tampilan yang berisi beberapa model tampilan:
Menurut Anda:
sumber
Jawab: Tidak
Ya , Anda dapat menggunakan Tuple (menghadirkan sulap yang memiliki banyak model).
Kode:
sumber
Tambahkan ModelCollection.cs ini ke Model Anda
Pengendali:
Pandangan:
sumber
cara sederhana untuk melakukan itu
kita bisa memanggil semua model terlebih dahulu
kemudian kirim model Anda dengan viewbag
dan dalam pandangan
maka dengan mudah gunakan Model seperti ini
sumber
Saran saya adalah membuat model tampilan besar:
Di Index.cshtml Anda, jika misalnya Anda memiliki 2 bagian:
dan di controller:
sumber
Saya ingin mengatakan bahwa solusi saya seperti jawaban yang diberikan pada halaman stackoverflow ini: ASP.NET MVC 4, beberapa model dalam satu tampilan?
Namun, dalam kasus saya, kueri linq yang mereka gunakan di Controller mereka tidak berfungsi untuk saya.
Ini dikatakan permintaan:
Akibatnya, "dalam tampilan Anda, tentukan saja bahwa Anda menggunakan koleksi model tampilan" juga tidak berfungsi untuk saya.
Namun, sedikit variasi pada solusi itu berhasil bagi saya. Ini solusi saya kalau-kalau ini bisa membantu siapa saja.
Berikut ini adalah model tampilan saya di mana saya tahu saya hanya akan memiliki satu tim tetapi tim itu mungkin memiliki beberapa papan (dan saya memiliki folder ViewModels dalam folder Model saya btw, maka namespace):
Sekarang ini adalah pengontrol saya. Ini adalah perbedaan paling signifikan dari solusi dalam tautan yang dirujuk di atas. Saya membangun ViewModel untuk mengirim ke tampilan secara berbeda.
Maka dalam pandangan saya, saya tidak menentukannya sebagai daftar. Saya hanya melakukan "@model TaskBoard.Models.ViewModels.TeamBoards" Maka saya hanya perlu satu untuk masing-masing ketika saya beralih ke papan Tim. Inilah pandangan saya:
Saya cukup baru untuk ASP.NET MVC jadi butuh sedikit waktu untuk mencari tahu. Jadi, saya berharap posting ini membantu seseorang untuk proyek mereka dalam jangka waktu yang lebih pendek. :-)
sumber
Anda selalu dapat melewatkan objek kedua dalam ViewBag atau Lihat Data.
sumber
Buat satu kelas baru di model dan properti Anda
LoginViewModel
danRegisterViewModel
:Kemudian gunakan
UserDefinedModel
dalam pandangan Anda.sumber
Ini adalah contoh yang disederhanakan dengan IEnumerable.
Saya menggunakan dua model pada tampilan: formulir dengan kriteria pencarian (model SearchParams), dan kotak untuk hasil, dan saya berjuang dengan cara menambahkan model IEnumerable dan model lainnya pada tampilan yang sama. Inilah yang saya buat, semoga ini membantu seseorang:
...)
SearchViewModel.cs:
DelegateController.cs:
CariParamsViewModel.cs:
sumber