2009-08-08 4 views
3

Je comprends qu'avec jEditable (http://www.appelsiini.net/projects/jeditable), vous pouvez effectuer des modifications sur place et POSTER les informations modifiées dans une URL.Utilisation de jEditable avec ASP.NET MVC (POSTing)

Mon affichage ASP.NET MVC affiche un tas d'informations de modèle que je voudrais modifier sur place. Actuellement, j'ai deux vues - une représentation de texte et une vue d'édition dans laquelle un formulaire est entièrement POSTed et alors mon action de contrôleur prend l'objet entier (assemblé des noms d'élément de forme) comme paramètre, mettant à jour l'objet et retournant au texte -seulement vue. Cependant, lorsque je passe à jEditable, j'utilise uniquement la vue texte et POST un seul élément à la fois, et non l'objet entier. Comment est-ce que je pourrais construire une action simple de contrôleur qui peut prendre ce que jEditable est POSTing et puis le mettre dans la propriété appropriée de mon objet?

Répondre

8

Il y a une assez bonne sample code here:

$("#myTextBox").editable('<%=Url.Action("UpdateSettings","Admin") %>', { 
      submit: 'ok', 
      cancel: 'cancel', 
      cssclass: 'editable', 
      width: '99%', 
      placeholder: 'emtpy', 
      indicator: "<img src='../../Content/img/indicator.gif'/>" 
     }); 


[AcceptVerbs("POST")] 
public ActionResult UpdateSettings(string id, string value) 
{ 
    // This highly-specific example is from the original coder's blog system, 
    // but you can substitute your own code here. I assume you can pick out 
    // which text field it is from the id. 
    foreach (var item in this.GetType().GetProperties()) 
    { 

     if (item.Name.ToLower().Equals(id, StringComparison.InvariantCultureIgnoreCase)) 
      item.SetValue(Config.Instance, value, null); 
    } 
    return Content(value); 
} 

Vous pourriez aussi avoir besoin ceci:
http://noahblu.wordpress.com/2009/06/17/jeditable-note-dont-return-json-and-how-to-return-strings-from-asp-net-mvc-actions/

+1

Mais que faire si j'ai un grand modèle, disons avec 20 propriétés. Ai-je besoin de 20 méthodes de contrôleur différentes? Ou si j'utilise une paire de paramètres id/value générique comme dans votre exemple, comment est-ce que j'ai la valeur automatiquement mettre à jour la bonne propriété d'objet? – Alex

+0

L'exemple de code original comportait une boucle ... Cela doit être le but de la boucle. J'ai rétabli la boucle dans l'exemple de code. Vous souhaiterez peut-être consulter l'entrée de blog d'origine. Avez-vous vraiment 20 petits éditeurs de texte sur votre page Web? Cela semble assez inhabituel. –

+0

Oui, pour modifier les détails de contact (nom, téléphone, etc.) – Alex

1

Voici ce que je fais par la réflexion:

Vue:

$(".edit").editable('<%=Url.Action("UpdateEventData","Event") %>', { 
       submitdata: {eventid: <%=Model.EventId %>}, 
       tooltip: "Click to edit....", 
       indicator: "Saving...", 
       submit : "Save", 
       cancel : "Cancel" 
      }); 

Controller:

public string UpdateEventData(int eventid, string id, string value) 
    { 
     //load the event 
     var evt = Repository.GetEvent(eventid); 

     //UpdateModel; 
     System.Reflection.PropertyInfo pi = evt.GetType().GetProperty(id); 
     if (pi==null) 
      return ""; 
     try 
     { 

      object newvalue = Concrete.HelperMethods.ChangeType(value, pi.PropertyType); 

      pi.SetValue(evt, newvalue, null); 
      Repository.Save(); 

     } 
     catch (Exception ex) 
     { 
      //handle errors here 
     } 

     return pi.GetValue(evt, null).ToString(); 

    } 

La méthode "HelperMethods.ChangeType" est une version plus robuste de Convert.ChangeType (il peut gérer nullables) que je suis arrivé de http://aspalliance.com/author.aspx?uId=1026.