2013-09-26 7 views
0

Je suis bloqué dans la publication du résultat de JSON, donc laissé la partie de succès vide.MVC: Résultat de JSON Remplissage automatique Afficher

Voir

@model MvcApplication2.Models.About 

@{ 
    ViewBag.Title = "About"; 
} 


<p> @Html.DisplayFor(m=>m.test) </p> 
<p> @Html.DisplayFor(m=>m.test1) </p> 

Modèle

public class About 
    { 
     public string test { get; set; } 
     public string test1 { get; set; } 
    } 

Contrôleur

public class HomeController : Controller 
    { 
     public JsonResult About() 
     { 
      ViewBag.Message = "Your app description page."; 
      About ab = new About() 
           { 
            test = "a", 
            test1 = "b" 
           }; 
      return Json(ab, JsonRequestBehavior.AllowGet); 
     } 
} 

JQuery dans le fichier externe

$(document).ready(function() { 

    var itemName = "#btn-about"; 

    $(itemName).click(function() { 
     $.ajax({ 
      type: 'GET', 
      dataType: 'Json', 
      url: '/Home/About', 
      success: function (data) { 
       var option = ''; 

      }, 
      error: function (xhr, ajaxOption, thorwnError) { 
       console.log("Error") 
      }, 
      processData: false, 
      async: true 
     }); 
    }); 
}); 

=> Je suis un peu confus maintenant. Bien que j'obtienne un résultat au format JSON en utilisant AJAX, je veux le publier dans cette vue 'About'. La vue a déjà @model défini, donc dès que j'obtiens le résultat, je veux que la vue le charge automatiquement car je ne pense pas que ce soit une bonne option pour créer des contrôles html en Javascript.

=> Est-il possible ou dois-je remplir le contrôle un par un.

=> Je suis nouveau à MVC, alors pourriez-vous me faire part de toute bonne suggestion.

+0

Nous ne parlons généralement pas des choses comme « contrôle » dans MVC. Au lieu de cela, nous utilisons la langue de HTML/browser et appelons les éléments DOM ou par leur nom de tag spécifique. Si vous voulez livrer des extraits plus complexes - par exemple un menu ou un onglet - et que vous voulez toujours le livrer via AJAX, pensez à renvoyer les vues partielles au format HTML plutôt que JSON. Avec JSON, il peut être plus difficile de mettre à jour un extrait HTML complexe. – tvanfosson

Répondre

0

Vous devez donner à vos éléments un identifiant ou une classe qui vous permettra d'interagir facilement avec eux sur le client. Ensuite, lorsque vous obtenez votre réponse, prenez les valeurs des données JSON et mettez à jour les éléments (en utilisant l'id/class pour le trouver) avec la nouvelle valeur. Je suppose que vous n'avez aucun modèle spécial défini pour vos chaînes, ajustez les sélecteurs dans le code si nécessaire pour en tenir compte si vous le faites.

Voir

<p class="testDisplay"> @Html.DisplayFor(m=>m.test) </p> 
<p class="test1Display"> @Html.DisplayFor(m=>m.test1) </p> 

code client

$(document).ready(function() { 

    var itemName = "#btn-about"; 

    $(itemName).click(function() { 
     $.ajax({ 
      type: 'GET', 
      dataType: 'Json', 
      url: '/Home/About', 
      success: function (data) { 
       $('.testDisplay').html(data.test); 
       $('.test1Display').html(data.test1); 
      }, 
      error: function (xhr, ajaxOption, thorwnError) { 
       console.log("Error") 
      }, 
      processData: false, 
      async: true 
     }); 
    }); 
}); 
+0

Eh bien, même si c'est le cas, mais ce n'est pas la solution que je m'attends.De mon point de vue, en vue, nous avons '@model' et chaque élément DOM est lié avec lui. Donc, quand j'obtiens le résultat de JSON, je veux que ces éléments DOM se peuplent automatiquement. Sinon, déclarer '@model' en haut de la vue est inutile. –

+0

@LakpaSherpa - vous ne comprenez pas la vue par rapport au HTML rendu dans le navigateur. Côté serveur, le modèle est utilisé pour générer du code HTML. Le navigateur ne sait rien sur le code Razor sur le serveur et, dans le client, vous devez interagir directement avec le code HTML. – tvanfosson

+0

peut être confondu avec le modèle MVC. Merci de me rectifier. Je chercherai plus de détails pour obtenir une solution alternative. –

-1

au lieu de retourner les données que vous devrez retourner la vue sous forme de chaîne et la jquery utiliser pour remplacer le résultat.

Controller:

public JsonResult About() 
    { 
     var model = // Your Model 
     return Json((RenderRazorViewToString("ViewNameYouWantToReturn", model)), JsonRequestBehavior.AllowGet); 
    } 

    [NonAction] 
    public string RenderRazorViewToString(string viewName, object model) 
    { 
     ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
      var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

Ensuite, en utilisant jquery vous pouvez remplacer le résultat dans un conteneur pour exemple: div comme suit:

$.ajax({ 
     type: 'GET', 
     dataType: 'Json', 
     url: '/Home/About', 
     success: function (result) { 
      $("#divId").replaceWith(result); 
     }, 
+0

Il n'y a aucune raison d'utiliser JSON si vous souhaitez renvoyer du code HTML. Renvoyez juste le HTML et passez le codage JSON. – tvanfosson

1

Controller:

public ActionResult About() 
{ 
    var model = repo.GetModel(); 
    return PartialViewResult("about", model); 
} 

jQuery:

$.ajax("/Controller/About/", { 
    type: "GET", 
    success: function (view) { 
     $("#aboutDiv").html(view); 
    } 
}); 

Dans Vue principale:

<div id="aboutDiv"><div> 
+0

Merci. laissez-moi essayer celui-ci aussi. –

Questions connexes