J'ai une application asp.net MVC. L'une des formes envoie des données json à une méthode publique (pas une action, peut-être plus tard) sur le contrôleur. Cela fonctionne très bien dans IE 8. Cependant, cela ne fonctionne pas dans Firefox 3.5.Post JSON fonctionne dans IE, pas dans FF
La vue est une liste d'objets triés jquery à l'intérieur d'un formulaire. Voici une version dépouillée de la forme:
<form class="cmxform" id="UserForm" method="post" action="/Home/Index">
//...the <li> objects that are sortable
<input type="submit" value="Save Changes" onclick="SaveLinks();" />
</form>
est le javascript ici pour tirer lorsque le bouton est cliqué./Accueil/ProcessLinks est une méthode publique dans le contrôleur, et visible et invisible est un paramètre étant transmis à la méthode:
function SaveLinks() {
var VisibleList = document.getElementById('sortable1');
var InvsibleList = document.getElementById('sortable2');
for (var i = 0; i < VisibleList.childNodes.length; i++) {
var link = {};
link.id = VisibleList.childNodes[i].childNodes[1].innerText;
link.title = VisibleList.childNodes[i].childNodes[2].innerText;
link.description = VisibleList.childNodes[i].childNodes[3].innerText;
link.url = VisibleList.childNodes[i].childNodes[4].innerText;
link.order = i + 1;
$.post("/Home/ProcessLinks/Visible", $.toJSON(link), function(data, testStatus) {
/*This is where the user can be notified that the item was saved successfully*/
//alert(link.id + " has been updated");
window.location.reload();
}, "text");
}
for (var i = 0; i < InvsibleList.childNodes.length; i++) {
var link = {};
link.id = InvsibleList.childNodes[i].childNodes[1].innerText;
link.title = InvsibleList.childNodes[i].childNodes[2].innerText;
link.description = InvsibleList.childNodes[i].childNodes[3].innerText;
link.url = InvsibleList.childNodes[i].childNodes[4].innerText;
link.order = i + 1;
$.post("/Home/ProcessLinks/Invisible", $.toJSON(link), function(data, testStatus) {
/*This is where the user can be notified that the item was saved successfully*/
//alert(link.id + " has been updated");
window.location.reload();
}, "text");
}
}
Je crois que la méthode ci-dessus ne soit pas déclenchée lorsque dans Firefox, comme les points d'arrêt que je place avec Firebug ne sont pas touchés.
Pour le plaisir, voici ma fonction Serverside:
public string ProcessLinks(string id)
{
string Type = id;
string json = Request.Form[0];
var serializer = new DataContractJsonSerializer(typeof(JsonObject));
var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(json));
JsonObject item = (JsonObject)serializer.ReadObject(memoryStream);
memoryStream.Close();
return "hello";
}
Et ma classe personnalisée JsonObject:
[DataContract]
public class JsonObject
{
[DataMember]
internal int id { get; set; }
[DataMember]
internal string title { get; set; }
[DataMember]
internal string description { get; set; }
[DataMember]
internal string order { get; set; }
[DataMember]
internal string url { get; set; }
}
Avez-vous une idée de ce que je fais mal? Je n'arrive pas à l'abattre.
La raison pour laquelle je publie chaque objet plutôt que l'ordre de la liste est parce que les propriétés des objets peuvent être modifiées avant la publication. Je refactoriserai une fois que cette preuve de concept sera disponible – splatto
Oui, ça marche. Je vais télécharger un fichier zip de la solution pour vous si vous souhaitez voir ce que je fais. – splatto
J'ai téléchargé les fichiers de solution sur http://splatto.net/content/sort.zip. – splatto