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.
Je vais pouvoir tester plus tard aujourd'hui, savez vous laisser le plus tôt possible. Tx. – Tobiasopdenbrouw
Et ça marche. Tx! – Tobiasopdenbrouw