2010-09-24 2 views
0

Voici la JS:Action jQuery POST to ASP.NET MVC2, la chaîne est obligatoire, les entiers ne sont pas obligatoires ...?

$('#createReview').click(function() { 
    CKEDITOR.instances['ReviewText'].updateElement(); 
    $.ajax({ 
     type: 'POST', 
     cache: false, 
     url: '/Review/Create', 
     data: $('#reviewForm').serialize(), 
     dataType: 'html', 
     success: function (response) { 
      $('#bookReview').html(response); 
     } 
    }); 
    return false; 
}); 

'createReview' est

L'action:

[HttpPost, ExportModelState] 
    public ActionResult Create(Review review) 
    { 
     if (ModelState.IsValid) 
     { 
      if (review.Create()) 
       return PartialView("EditReview", review); 
     } 

     return RedirectToAction("Edit"); 
    } 

Lorsque le formulaire est affiché, l'examen est créé, mais seulement la La propriété string est obligatoire - dans ce cas le ReviewText. Aucune des propriétés d'entier ne lie.

La partie la plus étrange est, lorsque je l'exécute en mode débogage, aucune des propriétés de liaison avec succès, pas même le ReviewText. Lorsque j'inspecte l'objet Review, tout est nul ou par défaut. Je suis allée et venir entre le mode normal et le débogage, et ça fait la même chose à chaque fois.

Je suis à perte.

Edit:

Voici la sortie complète de l'appel Serialize(), qui ne rentre pas dans un commentaire:

score = 0 = 0 & note & score = 0 & note = 0 = 0 & note & score = 0 = 0 & note & score = 0 = 0 & note & score = 0 = 0 & Book.Review.Rating & Note = 0 & ReviewID = 0 & ParentBookID = 1 & reviewText =% 3Cp% 3E% 0A% 09I% 26% 2339% 3Bm + an + idiot% 3C% 2Fp% 3E% 0A% 3Cbr +% 2F% 3E% 0A% 3Cdiv + version de prévention des incendies% 3D% 221.5.4% 22 + id% 3D% 22_firebugConsole% 22 + style% 3D% 22affiche% 3A + aucun% 3B% 22% 3E% 0A% 09% 26nbsp% 3B% 3C% 2Fdiv% 3E% 0A% 3Cbr +% 2F% 3E% 0A & DateCreated = 1% 2F1% 2F0001 + 12% 3A00% 3A00 + AM

Notez que "score" est introuvable dans ma base de données entière, et toute cette ordure à propos de Firebug mélangé là-dedans.

Edit # 2:

OK, donc tous les entrées "score" viennent du plugin jQuery Raty, qui a été rapidement un-plugin-ed. Firebug est en train d'attiser le texte provenant de l'instance de CKEditor, qui n'est même pas mis à jour avant la soumission du formulaire.

Ce truc côté client est vraiment génial!

Grrr ...

+0

Avez-vous essayé d'alerter la valeur de $ ('# reviewForm'). Serialize() 'à des fins de débogage? Quel est le résultat? –

+0

score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & score = 0 & Book.Review.Rating = 0 & Rating = 0 & ReviewID = 0 & ParentBookID = 1 & reviewText =% 3Cp% 3E% 0A% 09 + ..% 3Cbr +% 2F% 3E% 0A% 09% 26nbsp% 3B% 3C% 2Fp% 3E% 0A et DateCreated = 1% 2F1% 2F0001 + 12% 3A00% 3A00 + AM – asfsadf

Répondre

0

Je vais aller de l'avant et la craie celui-ci à une mauvaise combinaison de plug-ins: Firebug, CKEditor et Raty.

3

Vous ne l'avez pas montré comment vos classes de modèle ressemblent ni quels éléments d'entrée-ce que votre formulaire comporte. Essayer de reproduire le problème voici un exemple de travail que j'ai créé.Il devrait être assez proche de votre scénario:

Modèle:

public class Review 
{ 
    public int ReviewID { get; set; } 
    public int ParentBookID { get; set; } 
    public int Rating { get; set; } 
    public string ReviewText { get; set; } 
    public int[] Scores { get; set; } 
} 

Controller:

public class ReviewController : Controller 
{ 
    public ActionResult Edit() 
    { 
     var model = new Review 
     { 
      ReviewID = 1, 
      Rating = 5, 
      Scores = new[] { 1, 2, 3 } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(Review review) 
    { 
     if (ModelState.IsValid) 
     { 
      if (review.Create()) 
      { 
       return PartialView("EditReview", review); 
      } 
     } 

     // Notice that redirecting in an AJAX invoked action will simply 
     // send an HTTP redirect to the Edit action and redisplay the whole page 
     // which is probably not what you are looking for. Maybe it would be better 
     // to return a partial here. 
     return RedirectToAction("Edit");   
    } 
} 

Vue:

<% using (Html.BeginForm("Create", "Review", FormMethod.Post, new { id = "reviewForm" })) { %> 
    <div> 
     <%: Html.LabelFor(x => x.ReviewID)%> 
     <%: Html.TextBoxFor(x => x.ReviewID)%> 
    </div> 
    <div> 
     <%: Html.HiddenFor(x => x.ParentBookID)%> 
    </div> 
    <div> 
     <%: Html.LabelFor(x => x.Rating)%> 
     <%: Html.TextBoxFor(x => x.Rating)%> 
    </div> 
    <div> 
     <%: Html.LabelFor(x => x.ReviewText)%> 
     <%: Html.TextAreaFor(x => x.ReviewText)%> 
    </div> 
    <%: Html.EditorFor(x => x.Scores)%> 

    <input type="submit" value="Review" /> 
<% } %> 

<div id="bookReview"></div> 

Script:

<script type="text/javascript" src="<%: Url.Content("~/scripts/jquery-1.4.1.min.js") %>"></script> 
<script type="text/javascript"> 
$(function() { 
    $('#reviewForm').submit(function() { 
     $.ajax({ 
      type: this.method, 
      url: this.action, 
      data: $(this).serialize(), 
      dataType: 'html', 
      success: function (response) { 
       $('#bookReview').html(response); 
      } 
     }); 
     return false; 
    }); 
}); 
</script> 

Vous pouvez également jeter un oeil à l'excellent jquery form plugin pour que votre script simplifie à ceci:

$(function() { 
    $('#reviewForm').ajaxForm(function(response) { 
     $('#bookReview').html(response); 
    }); 
}); 
+0

Merci Darin. Je souhaite qu'il y ait * un * tableau nommé Score - la vérité est, je renvoie tout un tas de déchets avec cet appel Serialize(), et je ne sais pas d'où il vient. Je vois aussi des trucs sur Firebug. Je me demande si cela a à voir avec la combinaison de CKEditor, Firebug et jQuery. Le RedirectToAction vient de moi en essayant d'implémenter le modèle P-R-G. Ce plugin de formulaire est GTG alors? Je me demandais à ce sujet. – asfsadf

Questions connexes