Sou desenvolvedor Java, novo no .NET. Estou trabalhando em um projeto .NET MVC2 em que quero ter uma exibição parcial para quebrar um widget. Cada objeto de widget JavaScript possui um objeto de dados JSON que seria preenchido pelos dados do modelo. Os métodos para atualizar esses dados são vinculados a eventos quando os dados são alterados no widget ou se esses dados são alterados em outro widget.
O código é algo como isto:
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>
O que não sei é como enviar os dados SomeModelView
e, em seguida, poder usá-los para preencher o widget e convertê-los para JSON. Eu já tinha visto algumas maneiras simples de fazê-lo no controlador, mas não na exibição. Eu acho que essa é uma pergunta básica, mas eu venho há algumas horas tentando deixar isso mais liso.
fonte
Respostas:
No mvc3 com navalha
@Html.Raw(Json.Encode(object))
parece fazer o truque.fonte
Json.Serialize
vez de Codificar.Muito bem, você acabou de começar a usar o MVC e encontrou sua primeira grande falha.
Você realmente não deseja convertê-lo para JSON na visualização e não deseja convertê-lo no controlador, pois nenhum desses locais faz sentido. Infelizmente, você está preso a esta situação.
A melhor coisa que descobri é enviar o JSON para a visualização em um ViewModel, assim:
então use
na sua opinião. Esteja ciente de que o .NET JavaScriptSerializer padrão é uma porcaria.
fazê-lo no controlador pelo menos o torna testável (embora não seja exatamente como o descrito acima - você provavelmente quer usar um ISerializer como uma dependência para poder zombar dele)
Atualize também, em relação ao seu JavaScript, seria uma boa prática agrupar TODOS os JS de widget que você possui acima, desta forma:
dessa maneira, se você colocar vários widgets em uma página, não terá conflitos (a menos que precise acessar os métodos de outros lugares da página, mas nesse caso, você deverá registrar o widget com alguma estrutura de widget). Pode não ser um problema agora, mas seria uma boa prática adicionar os colchetes agora para economizar muito esforço no futuro, quando isso se tornar um requisito, também é uma boa prática OO encapsular a funcionalidade.
fonte
JavaScriptSerializer
ouReturn Json(object)
ambos usam os mesmos serializadores. A postagem do mesmo JSON de volta ao controlador reconstruirá o objeto para você, desde que você defina o modelo correto. Talvez durante o MVC2 tenha sido uma grande desvantagem .. mas hoje é muito fácil e conveniente. Você deve atualizar sua resposta para refletir isso.Achei muito legal fazer assim (uso na exibição):
Aqui está o método auxiliar de acordo com a classe Extension:
Não é super sofisticado, mas resolve o problema de onde colocá-lo (no Controller ou no modo de exibição?) A resposta é obviamente: nenhum;)
fonte
Você pode usar
Json
diretamente da ação,Sua ação seria algo como isto:
Editar
Acabei de ver que você supõe que esta é
Model
uma Visualização, portanto, o que foi exposto acima não é estritamente correto, você teria que fazer umaAjax
chamada para o método do controlador para obter isso.ascx
que foi dito pois não teria um modelo em si, deixarei meu código caso seja útil e você possa alterar a chamadaEditar 2 basta colocar o código no código
fonte
@ Html.Raw (Json.Encode (object)) pode ser usado para converter o objeto modal de exibição em JSON
fonte
Consulte https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
Eu fiz abaixo e funciona como charme.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
fonte
Estendendo a ótima resposta de Dave . Você pode criar um HtmlHelper simples .
E na sua opinião:
Dessa forma, você pode centralizar a lógica para criar o JSON se, por algum motivo, desejar alterar a lógica posteriormente.
fonte
O Andrew teve uma ótima resposta, mas eu queria mexer um pouco. A maneira como isso é diferente é que eu gosto que meus ModelViews não tenham dados gerais. Apenas os dados para o objeto. Parece que o ViewData se encaixa na conta dos dados gerais, mas é claro que sou novo nisso. Eu sugiro fazer algo assim.
Controlador
Visão
O que isso faz por você é que ele fornece os mesmos dados em seu JSON e em seu ModelView, para que você possa retornar o JSON de volta ao seu controlador e ele tenha todas as partes. Isso é semelhante a apenas solicitá-lo por meio de um JSONRequest, no entanto, requer menos uma chamada, para que você economize essa sobrecarga. BTW isso é descolado para datas, mas que parece ser outro segmento.
fonte