2010-06-09 4 views
1

Si vous avez les éléments suivants:Asp.Net MVC 2: Un moyen de partager des contrats de données avec javascript côté client?

  1. Asp.Net MVC 2 projets ayant des classes d'objets qui définissent des modèles de vue.
  2. Sérialiser ces modèles au client du navigateur Web à l'aide de JSON.
  3. Le client ajoute des informations aux objets, comme une ligne de commande sur une facture.
  4. Le client renvoie l'objet au serveur pour traitement.

Est-il possible de partager avec le client un contrat de données pour les objets JSON? Je voudrais vraiment que le serveur crée une commande en utilisant une usine de commande, puis l'envoie au client. Le client ajoute des lignes de commande à l'aide des contrats de données et renvoie l'objet entièrement rempli au format JSON.

Je voudrais vraiment faire ce qui suit en JavaScript au client:

var order = myService.OrderFactory.GetNewClientOrderRequest(); 
order.description = "Some New Order"; 
var orderLine = myService.OrderFactory.GetNewClientOrderLine(order); 
orderLine.setProductID(1234); 
orderLine.setQty(1); 
order.AddLine(orderLine); 
if(order.SubmitOrder() == true) { 
    //display confirmation 
} 

des exemples ou des liens page Web pour Asp.Net MVC 2 serait très utile.

Répondre

1

Eh bien, étant donné un exemple de modèle:

[DataContract] 
public class Item 
{ 
    [DataMember] 
    public string Title { get; set; } 
} 

Vous pouvez créer un filtre d'action qui deserialises vos objets de JSON:

/// <summary> 
/// Deserialises a DataContract parameter from its JSON equivalence. 
/// </summary> 
public class JsonParameterFilter : ActionFilterAttribute 
{ 
    #region Properties 
    /// <summary> 
    /// Gets or sets the parameter name. 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// Gets or sets the type of the parameter. 
    /// </summary> 
    public Type Type { get; set; } 
    #endregion 

    #region Methods 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    var request = filterContext.HttpContext.Request; 

    string contentType = request.ContentType; 
    if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Contains("application/json")) 
    { 
     var serialiser = new DataContractJsonSerializer(this.Type); 
     var @object = serialiser.ReadObject(request.InputStream); 

     filterContext.ActionParameters[Name] = @object; 
    } 
    } 
    #endregion 
} 

et appliquée à votre action:

[JsonParameterFilter(Name = "item", Type = typeof(Item))] 
public ActionResult ProcessItem(Item item) 
{ 
    // Do stuff here 

    return View(); 
} 

Ce dont vous avez besoin pour vous assurer est de publier les données avec le type de contenu "application/json":Il est évident que votre bibliothèque/script côté client doit être capable de créer une instance d'un objet javascript qui peut être désérialisé en tant qu'instance côté serveur.

+0

Phil Haack a finalement fait la même chose après avoir lu le message d'un ami http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument .aspx. –

Questions connexes