En faisant un rafraîchissement automatique en utilisant le code suivant, j'ai supposé que lorsque je fais un post, le modèle sera automatiquement envoyé au contrôleur:
$.ajax({
url: '<%=Url.Action("ModelPage")%>',
type: "POST",
//data: ??????
success: function(result) {
$("div#updatePane").html(result);
},
complete: function() {
$('form').onsubmit({ preventDefault: function() { } });
}
});
Chaque fois qu'il y a un article, j'ai besoin d'incrémenter l'attribut value dans le modèle:
public ActionResult Modelpage(MyModel model)
{
model.value = model.value + 1;
return PartialView("ModelPartialView", this.ViewData);
}
Mais le modèle n'est pas transmis au contrôleur lorsque la page est publiée avec la requête jQuery AJAX. Comment puis-je envoyer le modèle dans la demande AJAX?
La réponse simple (à partir de MVC 3, peut-être même 2) est que vous n'avez rien à faire de spécial.
Tant que vos paramètres JSON correspondent au modèle, MVC est suffisamment intelligent pour construire un nouvel objet à partir des paramètres que vous lui donnez. Les paramètres qui ne s'y trouvent pas sont par défaut.
Par exemple, le Javascript:
var values =
{
"Name": "Chris",
"Color": "Green"
}
$.post("@Url.Action("Update")",values,function(data)
{
// do stuff;
});
Le modèle:
public class UserModel
{
public string Name { get;set; }
public string Color { get;set; }
public IEnumerable<string> Contacts { get;set; }
}
Le controlle:
public ActionResult Update(UserModel model)
{
// do something with the model
return Json(new { success = true });
}
Si vous devez envoyer le modèle COMPLET au contrôleur, vous devez d'abord que le modèle soit disponible pour votre code javascript.
Dans notre application, nous le faisons avec une méthode d'extension:
public static class JsonExtensions
{
public static string ToJson(this Object obj)
{
return new JavaScriptSerializer().Serialize(obj);
}
}
Sur la vue, nous l'utilisons pour rendre le modèle:
<script type="javascript">
var model = <%= Model.ToJson() %>
</script>
Vous pouvez ensuite passer la variable de modèle dans votre appel $ .ajax.
J'ai une page MVC qui soumet le JSON des valeurs sélectionnées à partir d'un groupe de boutons radio.
J'utilise:
var dataArray = $.makeArray($("input[type=radio]").serializeArray());
Pour créer un tableau de leurs noms et valeurs. Ensuite, je le convertis en JSON avec:
var json = $.toJSON(dataArray)
puis le poster avec ajax () de jQuery sur le contrôleur MVC
$.ajax({
url: "/Rounding.aspx/Round/" + $("#OfferId").val(),
type: 'POST',
dataType: 'html',
data: json,
contentType: 'application/json; charset=utf-8',
beforeSend: doSubmitBeforeSend,
complete: doSubmitComplete,
success: doSubmitSuccess});
Qui envoie les données sous forme de données JSON natives.
Vous pouvez ensuite capturer le flux de réponse et le désérialiser dans l'objet C #/VB.net natif et le manipuler dans votre contrôleur.
Pour automatiser ce processus d'une manière agréable et nécessitant peu de maintenance, je vous conseille de lire cette entrée qui décrit assez bien la dé-sérialisation JSON automatique native.
Faites correspondre votre objet JSON pour correspondre à votre modèle et le processus lié ci-dessous devrait automatiquement désérialiser les données dans votre contrôleur. Cela fonctionne à merveille pour moi.
Cela peut être fait en créant un objet javascript pour correspondre à votre modèle mvc. Les noms des propriétés javascript doivent correspondre exactement au modèle mvc, sinon la liaison automatique ne se produira pas sur le message. Une fois que vous avez votre modèle côté serveur, vous pouvez le manipuler et stocker les données dans la base de données.
J'y parviens soit par un événement de double-clic sur une ligne de la grille, soit par un événement de clic sur un bouton quelconque.
@model TestProject.Models.TestModel
<script>
function testButton_Click(){
var javaModel ={
ModelId: '@Model.TestId',
CreatedDate: '@Model.CreatedDate.ToShortDateString()',
TestDescription: '@Model.TestDescription',
//Here I am using a Kendo editor and I want to bind the text value to my javascript
//object. This may be different for you depending on what controls you use.
TestStatus: ($('#StatusTextBox'))[0].value,
TestType: '@Model.TestType'
}
//Now I did for some reason have some trouble passing the ENUM id of a Kendo ComboBox
//selected value. This puzzled me due to the conversion to Json object in the Ajax call.
//By parsing the Type to an int this worked.
javaModel.TestType = parseInt(javaModel.TestType);
$.ajax({
//This is where you want to post to.
url:'@Url.Action("TestModelUpdate","TestController")',
async:true,
type:"POST",
contentType: 'application/json',
dataType:"json",
data: JSON.stringify(javaModel)
});
}
</script>
//This is your controller action on the server, and it will autobind your values
//to the newTestModel on post.
[HttpPost]
public ActionResult TestModelUpdate(TestModel newTestModel)
{
TestModel.UpdateTestModel(newTestModel);
return //do some return action;
}
Je pense que vous devez passer explicitement l'attribut de données. Pour cela, vous pouvez utiliser data = $ ('# votre-formulaire-id'). Serialize ();
Ce message peut être utile. Poster avec jquery et ajax
Jetez un oeil à la doc ici .. Ajax sérialiser
vous pouvez créer une variable et l'envoyer à ajax.
var m = { "Value": @Model.Value }
$.ajax({
url: '<%=Url.Action("ModelPage")%>',
type: "POST",
data: m,
success: function(result) {
$("div#updatePane").html(result);
},
complete: function() {
$('form').onsubmit({ preventDefault: function() { } });
}
});
Tout le champ du modèle doit être entouré de m.
En appel ajax mention-
data:MakeModel(),
utilisez la fonction ci-dessous pour lier les données au modèle
function MakeModel() {
var MyModel = {};
MyModel.value = $('#input element id').val() or your value;
return JSON.stringify(MyModel);
}
Attachez l'attribut [HttpPost] à l'action de votre contrôleur
sur POST ces données seront disponibles