2010-08-04 12 views
2

En mélangeant et en comparant des tutoriels plus anciens avec des messages récents sur MVC 3 Preview 1, je rencontre le problème suivant. J'essaye de passer aux éditions commandées par JSON de mon modèle Fighter (et de la base de données sous-jacente) au lieu des éditions "plain old" sans JSON.JSON/MVC (3P1) HttpPost - ne pas le faire fonctionner sur ma classe EF

J'ai une vue d'édition (qui utilise une configuration Shared EditorTemplate, fighter.ascx) pour ma classe Fighter (qui existe dans un modèle EF 4).

Sur ce j'ai 2 boutons. Un "ancien", qui est un submit qui appelle mon contrôleur d'édition sans JSON, et un nouveau, pour lequel j'ai écrit un nouveau HttpPost ActionResult

L'ancien bouton fonctionne: le nouveau bouton est seulement à moitié implémenté mais déjà je peux voir que le ActionResult UpdateJsonTrick ne reçoit pas les données de la vue correctement. La chaîne returnMessage lit: "Combattant créé" dans le système. " Avant de pouvoir faire quoi que ce soit d'utile dans cette ActionResult, je dois savoir comment transmettre ces données. Où vais-je mal?

Ainsi, le Edit.aspx est juste une déclaration Html.EditorForModel("Fighter") simple, mais voici la Fighter.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc3_EF_BW_Fight.Models.Fighter>" %> 
<% using (Html.BeginForm()) 
    {%> 
<%: Html.ValidationSummary(true) %> 
<script type="text/javascript" src="../../../Scripts/jquery-1.4.1.min.js"></script> 
<script type="text/javascript" src="../../../Scripts/json2.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 

     $("#JSONTRICK").click(function (event) { 

      var fighter = { Id: $('#Id').val(), 
       FighterName: $('#FighterName').val(), 
       FighterStyleDescription: $('#FighterStyleDescription').val(), 
       FighterLongDescription: $('#FighterLongDescription').val() 

      }; 

      $.ajax({ 
       url: '/Barracks/UpdateJsonTrick', 
       type: "POST", 
       data: JSON.stringify(fighter), 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        // get the result and do some magic with it 
        var message = data.Message; 
        $("#resultMessage").html(message); 
       }, 
       error: function() { 
        $('#message').html('oops Error').fadeIn(); 
       } 
      }); 

      return false; 
     }); 


    }); 
</script> 
<fieldset> 
    <legend>Fighter template</legend> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Id) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Id) %> 
     <%: Html.ValidationMessageFor(model => model.Id) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterName) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.FighterName) %> 
     <%: Html.ValidationMessageFor(model => model.FighterName) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterStyleDescription) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.FighterStyleDescription) %> 
     <%: Html.ValidationMessageFor(model => model.FighterStyleDescription) %> 
    </div> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.FighterLongDescription) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextAreaFor(model => model.FighterLongDescription) %> 
     <%: Html.ValidationMessageFor(model => model.FighterLongDescription) %> 
    </div> 
    <p> 
     <input type="submit" value="Save" id="save" /> 
    </p> 
    <p> 
     <input type="submit" value="JSONTRICK" id="JSONTRICK" /> 
     <label id="message"> 
      message</label> 
    </p> 
    <div> 
     <span id="resultMessage"></span> 
    </div> 
</fieldset> 
<% } %> 

Et voici le (bit correspondant du) contrôleur:

[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) //Works 
{ 
    var fighter = _FightDb.Fighters.Single(f => f.Id == id); 

    try 
    { 
     UpdateModel(fighter); 
     //var x = ViewData.GetModelStateErrors(); 
     _FightDb.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     var viewModel = _FightDb.Fighters.Single(f => f.Id == id); //fighter; 

     return View(viewModel); 
    } 

} 

[HttpPost] 
public ActionResult UpdateJsonTrick(Fighter fighter) //doesn't work 
{ 
    var x = ViewData.GetModelStateErrors(); 
    string returnMessage = string.Format("Created fighter '{0}' in the system.", fighter.FighterName); 
    return Json(new PersonViewModel { Message = returnMessage }); 

} 

Merci pour votre patience, si vous avez besoin de plus de code ou d'information, je peux fournir.

Répondre

1

Il y a un bug dans MVC 3 Preview 1 où le JsonValueProviderFactory n'est pas enregistré par défaut.

Avoir quelque chose comme ça dans votre Global.asax devrait aider:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()) 
+0

Je vais pouvoir tester plus tard aujourd'hui, savez vous laisser le plus tôt possible. Tx. – Tobiasopdenbrouw

+0

Et ça marche. Tx! – Tobiasopdenbrouw