Estoy haciendo una aplicación MVC donde tengo que pasar un objeto json del controlador a la vista.

var dictionary = listLocation.ToDictionary(x => x.label, x => x.value);
return Json(new { values = listLocation}, JsonRequestBehavior.AllowGet);

El código que estoy utilizando en mi controlador , ahora cuando me implementar la página de vista de su apertura a un diálogo de descarga en mi navegador , al abrir el archivo me da un objeto json como yo necesitaba formato.

Ahora quiero volver a mi ver página también quieren tener acceso al objeto json en la página de vista. ¿cómo puedo hacer eso.

InformationsquelleAutor Purushoth | 2013-03-04

4 Comentarios

  1. 58

    Al hacer return Json(...) específicamente diciendo MVC no utilizar una vista, y para servir de serializar los datos JSON. Su navegador se abrirá un cuadro de diálogo de descarga, ya que no sabe qué hacer con estos datos.

    Si quieres volver a una vista, sólo hacer return View(...) como lo haría normalmente:

    var dictionary = listLocation.ToDictionary(x => x.label, x => x.value);
    return View(new { Values = listLocation });

    A continuación, en su opinión, simplemente codificar los datos en JSON y asignarlo a una variable de JavaScript:

    <script>
        var values = @Html.Raw(Json.Encode(Model.Values));
    </script>

    EDITAR

    Aquí es un poco más completa de la muestra. Ya que no tengo suficiente contexto de usted, en este ejemplo se supone un controlador de Foo, una acción Bar, y un modelo de vista FooBarModel. Además, la lista de los lugares es codificado:

    Controladores/FooController.cs

    public class FooController : Controller
    {
        public ActionResult Bar()
        {
            var locations = new[]
            {
                new SelectListItem { Value = "US", Text = "United States" },
                new SelectListItem { Value = "CA", Text = "Canada" },
                new SelectListItem { Value = "MX", Text = "Mexico" },
            };
    
            var model = new FooBarModel
            {
                Locations = locations,
            };
    
            return View(model);
        }
    }

    Modelos/FooBarModel.cs

    public class FooBarModel
    {
        public IEnumerable<SelectListItem> Locations { get; set; }
    }

    Vistas/Foo/Bar.cshtml

    @model MyApp.Models.FooBarModel
    
    <script>
        var locations = @Html.Raw(Json.Encode(Model.Locations));
    </script>

    Por el aspecto de su mensaje de error, parece que se están mezclando tipos incompatibles (es decir, Ported_LI.Models.Locatio‌​n y MyApp.Models.Location) así que, para recapitular, asegúrese de que el tipo de envió de la acción de controlador lado coincidir con lo que se recibe de la vista. Para este ejemplo en particular, new FooBarModel en el controlador de partidos @model MyApp.Models.FooBarModel en la vista.

    • Hola daniel, tengo el siguiente error en mi página de vista ,cuando he usado el código de arriba. «El modelo de elemento pasado en el diccionario es de tipo ‘<>f__AnonymousType31[System.Collections.Generic.List1[Ported_LI.Modelos.Ubicación]]’, pero este diccionario se requiere un elemento de modelo de tipo ‘MyApp.Modelos.Ubicación'». Por favor, ayudar aún más.
    • Exactamente lo que estaba buscando. Parece extraño que es el punto de vista que hace la codificación Json. Yo creo que el Controlador podría/debería tener esta función. Su ejemplo es muy útil.
    • Si usted realmente desea, usted podría poner Json.Encode en el controlador. Personalmente yo no lo haría, porque (1) la lógica del controlador mantiene simple; (2) la representación canónica le da más flexibilidad. Por ejemplo, usted puede recorrer en iteración la colección, hacer las oraciones condicionales (es decir,if (Model.Locations.Any()) { ... }), etc.); si se codifican en el controlador, su punto de vista es, básicamente, pegado con una cadena; y (3) no creo que el controlador debe ser responsable de lo que en esencia es una presentación preocupación (es decir, el JavaScript en su opinión, lo que determina la necesidad de JSON). Saludos.
    • justo lo suficiente. Lo mío no es exactamente un punto de vista purista 😉 … yo reconozco que el de la convención de y el respeto. Ya que el servidor es en realidad la codificación del objeto json y las vistas pueden llegar desordenados muy rápidamente, he estado considerando una dedicada objeto que codifica modelos a json fuera de los propios Controladores. Pero que no se encuentra en la placa por ahora. Puede ser estático de la utilidad que viene más tarde, dependiendo de nuestras necesidades de crecimiento. Saludos.
    • En MVC 6 (tal vez también 6) usted necesita para utilizar Json.Serialize en lugar de Encode.
  2. 4

    Usted podría utilizar AJAX para llamar a esta acción del controlador. Por ejemplo, si usted está usando jQuery puede utilizar la $.ajax() método:

    <script type="text/javascript">
        $.ajax({
            url: '@Url.Action("NameOfYourAction")',
            type: 'GET',
            cache: false,
            success: function(result) {
                //you could use the result.values dictionary here
            }
        });
    </script>
    • Hola Darin, he probado tu método aún le da a descargar el diálogo cuando se accede a la vista de la página.
  3. 0
    <script type="text/javascript">
    jQuery(function () {
        var container = jQuery("\#content");
        jQuery(container)
         .kendoGrid({
             selectable: "single row",
             dataSource: new kendo.data.DataSource({
                 transport: {
                     read: {
                         url: "@Url.Action("GetMsgDetails", "OutMessage")" + "?msgId=" + msgId,
                         dataType: "json",
                     },
                 },
                 batch: true,
             }),
             editable: "popup",
             columns: [
                { field: "Id", title: "Id", width: 250, hidden: true },
                { field: "Data", title: "Message Body", width: 100 },
               { field: "mobile", title: "Mobile Number", width: 100 },
             ]
         });
    });

    • Json Retorno De Datos Html. cómo renderizar este resultado en json en la vista.
  4. -2
    $.ajax({
        dataType: "json",
        type: "POST",
        url: "/Home/AutocompleteID",
        data: data,
        success: function (data) {
            $('#search').html('');
            $('#search').append(data[0].Scheme_Code);
            $('#search').append(data[0].Scheme_Name);
        }
    });
    • Por favor, incluya la explicación de lo que el código hace y cómo se responde a la pregunta. Si usted recibe un fragmento de código como una respuesta, puede que no sepa qué hacer con él. Respuesta debería dar el OP y los futuros visitantes orientación sobre cómo depurar y solucionar su problema. Señalando, en lo que la idea detrás de tu código, ayuda mucho en la comprensión del problema y la aplicación o modificación de su solución.
    • Aunque estoy de acuerdo con usted en su explicación, y creo que eso haría que el fragmento de una mejor respuesta, en la práctica 10K+ y 100K+ ms responden dar fragmentos de todo el tiempo y que es aceptado sin discusión. Esta respuesta es por lo tanto legítimo como el sitio se encuentra ahora, a menos que los cambios en el gobierno de la filosofía se hizo.
    • Conocí este de VLQ revisión de la cola, publicado el comentario y editado; no sugieren la eliminación. Veo estamos de acuerdo en el hecho, de que el código-fragmento de respuestas están bien. Me gusta dar orientación sobre cómo hacerlas mejor.
    • Era yo la que se marcan como «no respuesta» porque es confuso (el código sobrante en el fragmento de código donde se copia/pega es inútil), que no se explica, y podría haber sido fácilmente un comentario con un enlace a jQuery página en $.ajax. Yo no creo que fue lo suficientemente significativos para ser una respuesta efectiva. Yo diría que el fragmento de código-sólo respuestas son bellas cuando son relevantes y auto-explicativo, pero no creo que éste se adapte a ese proyecto de ley.
    • Me hizo probar un append (de filas de una tabla), pero sin éxito. -su

Dejar respuesta

Please enter your comment!
Please enter your name here