2010-12-14 18 views
2

Dans ma base de données, j'ai 40 tables qui contiennent uniquement un ID et un nom. Ma base de données est accessible en utilisant Entity Framework. Bien que je n'aie aucun problème à les éditer en générant une vue fortement typée et des méthodes de publication pour chaque objet, je voudrais créer une méthode et une vue plus génériques pour voir et éditer ces objets. J'utilise actuellement le code suivant pour accéder à chaque objet. Dans ce cas, il est un objet de « AddressType »:Création d'une vue d'édition générique avec ASP.NET, MVC et Entity Framework

public ActionMethod EditAddressType(int ID) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    View(result); 
} 

[HttpPost] 
public ActionMethod EditAddressType(int ID, FormCollection formValues) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    UpdateModel(result); 
    database.SaveChanges(); 
    return View("SaveSuccess"); 
} 

La vue « EditAddressType » est fortement typé et fonctionne très bien, mais il y a beaucoup de code répété (une instance de cette opération pour chaque objet). On m'a dit que je devais utiliser la réflexion, mais je ne sais pas comment l'appliquer. Ma compréhension est que j'ai besoin de récupérer le type d'objet afin que je puisse remplacer la référence codée en dur à l'objet, mais je ne sais pas comment obtenir cette information à partir de la publication.

J'ai réussi à lier les informations à ViewData dans le contrôleur et à transmettre cela à une vue ViewPage qui sait rechercher cette ViewData, mais je ne sais pas comment publier les modifications sur un contrôleur.

Merci pour toute aide que vous pouvez me donner!

Répondre

0

Si vous modifiez l'objet, vous n'avez pas besoin de le récupérer à partir de la base de données dans votre action POST. La première chose serait bien sûr le code abstrait mon accès aux données du contrôleur:

public class AddressesController: Controller 
{ 
    private readonly IAddressesRepository _repository; 
    public AddressesController(IAddressesRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionMethod Edit(int id) 
    { 
     var result = _repository.GetAddress(id); 
     return View(result); 
    } 

    [HttpPut] 
    public ActionMethod Update(AddressViewModel address) 
    { 
     _repository.Save(address); 
     return View("SaveSuccess"); 
    } 
} 

Vous remarquerez que j'ai renommé certaines des actions et accepter les verbes pour faire ce contrôleur un peu plus RESTFul.

La vue associée pourrait ressembler à ceci:

<% using (Html.BeginForm<AddressesController>(c => c.Update(null))) { %> 
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %> 
    <%: Html.HiddenFor(model => model.Id) %> 
    <%: Html.TextBoxFor(model => model.Name) %> 
    <input type="submit" value="Save" /> 
<% } %> 

En ce qui concerne la mise en œuvre de cette interface IAddressesRepository concerne, c'est totalement à vous: Entity Framework, NHibernate, fichier XML, appels de service Web à distance, ..., c'est un détail d'implémentation qui n'a rien à voir avec ASP.NET MVC.

+0

Cela semble prometteur. Je vais certainement essayer de rendre mon programme plus RESTful. Cependant, je suis toujours perdu sur la façon de rendre cela plus générique afin qu'il puisse mettre à jour des objets autres que AddressType, comme UserType ou EventType, qui ont aussi un ID et un composant Name. J'essaye d'éviter des choses codées en dur comme AddressController ou AddressType, parce que quand je veux mettre à jour UserType, j'emploierai exactement le même code excepté toutes les instances de AddressType seront remplacées par UserType. – JimF

+0

Dans la méthode Mise à jour illustrée ci-dessus, je n'ai pas pu enregistrer l'adresse en raison de la perte du contexte de base de données d'origine lors de son passage à la vue. J'ai essayé using _repository.Attach (adresse) pour réappliquer son contexte de données mais cela lève une exception. C'était la raison originale pour laquelle je suis retourné à la base de données pour obtenir l'objet AddressType original, pour avoir un objet avec le contexte nécessaire pour exécuter UpdateModel (...) – JimF