Saya adalah pengembang Java, baru mengenal .NET. Saya sedang mengerjakan proyek .NET MVC2 di mana saya ingin memiliki tampilan parsial untuk membungkus widget. Setiap objek widget JavaScript memiliki objek data JSON yang akan diisi oleh data model. Kemudian metode untuk memperbarui data ini terikat dengan peristiwa ketika data diubah di widget atau jika data itu diubah di widget lain.
Kodenya kira-kira seperti ini:
MyController
:
virtual public ActionResult DisplaySomeWidget(int id) {
SomeModelView returnData = someDataMapper.getbyid(1);
return View(myview, returnData);
}
myview.ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModelView>" %>
<script type="text/javascript">
//creates base widget object;
var thisWidgetName = new Widget();
thisWidgetName.updateTable = function() {
// UpdatesData
};
$(document).ready(function () {
thisWidgetName.data = <% converttoJSON(model) %>
$(document).bind('DATA_CHANGED', thisWidgetName.updateTable());
});
</script>
<div><%:model.name%></div>
Apa yang saya tidak tahu adalah bagaimana mengirim data sebagai SomeModelView
dan kemudian dapat menggunakannya untuk mengisi widget serta mengubahnya menjadi JSON. Saya telah melihat beberapa cara sederhana untuk melakukannya di controller tetapi tidak dalam tampilan. Saya pikir ini adalah pertanyaan mendasar, tetapi saya sudah mencoba selama beberapa jam untuk menjadikannya apik.
sumber
Jawaban:
Di MVC3 dengan pisau cukur
@Html.Raw(Json.Encode(object))
tampaknya melakukan trik.sumber
Json.Serialize
alih-alih Encode.Bagus sekali, Anda baru saja mulai menggunakan MVC dan Anda telah menemukan cacat besar pertamanya.
Anda tidak benar-benar ingin mengubahnya menjadi JSON dalam tampilan, dan Anda tidak benar-benar ingin mengubahnya di controller, karena tidak satu pun dari lokasi ini masuk akal. Sayangnya, Anda terjebak dengan situasi ini.
Hal terbaik yang saya temukan lakukan adalah mengirim JSON ke tampilan dalam ViewModel, seperti ini:
lalu gunakan
menurut Anda. Ketahuilah bahwa standar .NET JavaScriptSerializer cukup jelek.
melakukannya di pengontrol setidaknya membuatnya dapat diuji (walaupun tidak persis seperti di atas - Anda mungkin ingin mengambil ISerializer sebagai dependensi sehingga Anda dapat mengejeknya)
Perbarui juga, mengenai JavaScript Anda, itu akan menjadi praktik yang baik untuk membungkus SEMUA widget JS yang Anda miliki di atas seperti:
dengan cara ini jika Anda meletakkan banyak widget di sebuah halaman, Anda tidak akan mendapatkan konflik (kecuali jika Anda perlu mengakses metode dari tempat lain di halaman, tetapi dalam hal ini Anda harus mendaftarkan widget dengan beberapa kerangka kerja widget tetap). Ini mungkin tidak menjadi masalah sekarang, tetapi akan menjadi praktik yang baik untuk menambahkan tanda kurung sekarang untuk menyelamatkan diri Anda dari banyak upaya di masa depan ketika itu menjadi persyaratan, itu juga praktik OO yang baik untuk merangkum fungsionalitas.
sumber
JavaScriptSerializer
atauReturn Json(object)
keduanya menggunakan serializers yang sama. Juga memposting JSON yang sama kembali ke controller akan membangun kembali objek untuk Anda selama Anda mendefinisikan model yang benar. Mungkin selama MVC2 itu adalah kelemahan utama .. tapi hari ini sangat mudah dan nyaman. Anda harus memperbarui jawaban Anda untuk mencerminkan ini.Saya merasa cukup baik melakukannya seperti ini (penggunaan dalam tampilan):
Berikut ini adalah kelas ekstensi metode helper menurut:
Ini bukan super-sofanggih, tetapi memecahkan masalah di mana harus meletakkannya (dalam Pengontrol atau dalam tampilan?) Jawabannya jelas: tidak;)
sumber
Anda dapat menggunakan
Json
dari tindakan secara langsung,Tindakan Anda akan menjadi seperti ini:
Edit
Hanya melihat bahwa Anda menganggap ini adalah
Model
tampilan sehingga di atas tidak sepenuhnya benar, Anda harus membuatAjax
panggilan ke metode controller untuk mendapatkan ini, makaascx
tidak akan memiliki model sendiri, saya akan meninggalkan kode saya kalau-kalau itu berguna bagi Anda dan Anda dapat mengubah panggilanEdit 2 cukup masukkan id ke dalam kode
sumber
@ Html.Raw (Json.Encode (objek)) dapat digunakan untuk mengonversi View Modal Object ke JSON
sumber
Memperluas jawaban yang bagus dari Dave . Anda dapat membuat HtmlHelper sederhana .
Dan menurut Anda:
Dengan cara ini Anda dapat memusatkan logika untuk membuat JSON jika Anda, karena suatu alasan, ingin mengubah logika nanti.
sumber
Rujuk https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
Saya lakukan di bawah dan ini bekerja seperti pesona.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
sumber
Andrew memiliki respons yang hebat tetapi saya ingin sedikit mengubahnya. Cara ini berbeda adalah bahwa saya suka ModelViews saya tidak memiliki data overhead di dalamnya. Hanya data untuk objek. Tampaknya ViewData sesuai dengan tagihan untuk data di atas kepala, tapi tentu saja saya baru dalam hal ini. Saya sarankan melakukan sesuatu seperti ini.
Pengendali
Melihat
Apa ini bagi Anda adalah memberi Anda data yang sama di JSON Anda seperti di ModelView Anda sehingga Anda berpotensi mengembalikan JSON kembali ke controller Anda dan itu akan memiliki semua bagian. Ini mirip dengan hanya memintanya melalui JSONRequest namun itu membutuhkan satu panggilan lebih sedikit sehingga menghemat overhead Anda. BTW ini funky untuk Tanggal tetapi sepertinya utas lainnya.
sumber