Soy un desarrollador de Java, nuevo en .NET. Estoy trabajando en un proyecto .NET MVC2 donde quiero tener una vista parcial para ajustar un widget. Cada objeto de widget de JavaScript tiene un objeto de datos JSON que se completará con los datos del modelo. Luego, los métodos para actualizar estos datos están vinculados a eventos cuando los datos se cambian en el widget o si esos datos se cambian en otro widget.
El código es algo como esto:
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>
Lo que no sé es cómo enviar los datos como SomeModelView
y luego poder usarlos para completar el widget y convertirlos a JSON. Había visto algunas formas simples de hacerlo en el controlador, pero no en la vista. Me imagino que esta es una pregunta básica, pero he estado yendo por unas horas tratando de hacer esto ingenioso.
fuente
Respuestas:
En mvc3 con navaja
@Html.Raw(Json.Encode(object))
parece hacer el truco.fuente
Json.Serialize
lugar de Encode.Bien hecho, acabas de comenzar a usar MVC y has encontrado su primer defecto importante.
Realmente no desea convertirlo a JSON en la vista, y realmente no desea convertirlo en el controlador, ya que ninguna de estas ubicaciones tiene sentido. Desafortunadamente, estás atrapado con esta situación.
Lo mejor que he encontrado es enviar el JSON a la vista en un ViewModel, así:
luego usa
en tu opinión Tenga en cuenta que el .NET JavaScriptSerializer estándar es bastante basura.
hacerlo en el controlador al menos lo hace comprobable (aunque no exactamente como lo anterior, probablemente desee tomar un ISerializer como una dependencia para que pueda burlarse de él)
Actualice también, con respecto a su JavaScript, sería una buena práctica envolver TODO el widget JS que tiene arriba de la siguiente manera:
de esta manera, si coloca múltiples widgets en una página, no obtendrá conflictos (a menos que necesite acceder a los métodos desde otra parte de la página, pero en ese caso debería registrar el widget con algún marco de widget de todos modos). Puede que ahora no sea un problema, pero sería una buena práctica agregar los corchetes ahora para ahorrarse muchos esfuerzos en el futuro cuando se convierta en un requisito, también es una buena práctica de OO encapsular la funcionalidad.
fuente
JavaScriptSerializer
oReturn Json(object)
ambos usan los mismos serializadores. Publicar también el mismo JSON en el controlador reconstruirá el objeto para usted siempre que defina el modelo correcto. Quizás durante MVC2 fue un gran inconveniente ... pero hoy es muy sencillo y muy conveniente. Debería actualizar su respuesta para reflejar esto.Me pareció bastante agradable hacerlo así (uso en la vista):
Aquí está la clase de extensión del método auxiliar correspondiente:
No es súper sofisticado, pero resuelve el problema de dónde colocarlo (¿en el controlador o en la vista?) La respuesta es obviamente: ninguno;)
fuente
Puedes usar
Json
directamente desde la acción,Tu acción sería algo como esto:
Editar
Acabo de ver que asumes que esto es
Model
de una Vista, por lo que lo anterior no es estrictamente correcto, tendrías queAjax
llamar al método del controlador para obtener esto,ascx
entonces no tendría un modelo per se, dejaré mi código en caso de que te sea útil y puedas modificar la llamadaEdit 2 acaba de poner id en el código
fuente
@ Html.Raw (Json.Encode (objeto)) se puede usar para convertir el objeto modal Ver a JSON
fuente
Extendiendo la gran respuesta de Dave . Puede crear un HtmlHelper simple .
Y en tu opinión:
De esta forma, puede centralizar la lógica para crear el JSON si, por alguna razón, desea cambiar la lógica más adelante.
fuente
Consulte https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
Lo hice a continuación y funciona a las mil maravillas.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
fuente
Andrew tuvo una gran respuesta, pero quería modificarla un poco. La forma en que esto es diferente es que me gusta que mis ModelViews no tengan datos generales. Solo los datos para el objeto. Parece que ViewData se ajusta a la factura de los datos generales, pero, por supuesto, soy nuevo en esto. Sugiero hacer algo como esto.
Controlador
Ver
Lo que esto hace por usted es que le brinda los mismos datos en su JSON que en su ModelView para que pueda devolver el JSON a su controlador y tendría todas las partes. Esto es similar a solo solicitarlo a través de JSONRequest, sin embargo, requiere una llamada menos, por lo que le ahorra esa sobrecarga. Por cierto, esto es funky para Dates pero parece otro hilo.
fuente