2010-05-28 3 views
0

Lequel de ces deux scénarios est la meilleure pratique dans ASP.NET MVC?Dans ASP.NET MVC doit-il se poster un formulaire ou une autre action?

1 Message à l'auto

Dans la vue que vous utilisez

using (Html.BeginForm) { 
    ... 
} 

Et dans le contrôleur vous avez

[HttpGet] 
    public ActionResult Edit(int id) 

    [HttpPost] 
    public ActionResult Edit(EditModel model) 

2 Poster de Modifier pour sauver

Dans la vue que vous utilisez

using (Html.BeginForm("Save", "ControllerName")) { 

Et dans le contrôleur vous avez

[HttpGet] 
    public ActionResult Edit(int id) 

    [HttpPost] 
    public ActionResult Save(EditModel model) 

Résumé

Je peux voir les avantages de chacun d'entre eux, l'ancien vous donne un plus reposant style, avec la même adresse utilisée conjointement avec le verbe HTTP correct (GET, POST, PUT, DELETE et ainsi de suite). Ce dernier a un schéma d'URL qui rend chaque adresse très spécifique.

Quelle est la bonne façon de procéder?

Répondre

4

Pour un contrôleur RESTful:

// return an HTML form for editing a specific entity 
public ActionResult Edit(int id) { } 

// find and update a specific entity 
[HttpPut] 
public ActionResult Update(EditModel userView) { } 

Et dans la vue:

<% using (Html.BeginForm<HomeController>(c => c.Update(null))) {%> 
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %> 
    <%: Html.EditorForModel() %> 
    <input type="submit" value="Save" /> 
<% } %> 
+0

Je ne veux pas commencer la discussion de côté à ce sujet, mais je voulais souligner qu'il y a un léger problème avec les spécifications W3 qui signifie que je ne vais pas utiliser PUT à tout moment: http: //www.w3 .org/TR/html401/interact/forms.html # adef-method - mais votre réponse est toujours correcte en termes de REST. – Fenton

+0

C'est pourquoi vous utilisez l'assistant 'Html.HttpMethodOverride'. Votre formulaire HTML peut-être pas, mais d'autres consommateurs oui. –

3

Publier la même action.

Sinon, si la validation échoue dans Enregistrer, vous devrez rediriger vers Modifier. Vous devriez stocker des messages d'erreur dans Tempdata et repeupler ModelState.

+0

Merci - Je n'avais pas pensé à cet aspect de la question. – Fenton

0

Je préfère utiliser Edit/mise à jour car je pense qu'il rend plus clair sur ce que l'action est en train de faire. Stephen Walther a some good suggestions for standard action names en utilisant cette convention.

Je ne pense pas que cela fonctionne vraiment, mais je dirais qu'être cohérent dans tous vos contrôleurs est plus important.

Comme une note de côté, si REST est une exigence de la vôtre, alors je crois que ce qui suit est plus vrai à une application REST:

[HttpGet] 
public ActionResult Customer(int id) { 
    //return customer details 
} 

[HttpPut] 
public ActionResult Customer(Customer cust) { 
    //update customer 
} 

[HttpPost] 
public ActionResult Customer(Customer cust) { 
    //insert new customer 
} 

Si REST ins't nécessaire, alors je partirais avec Edit/Mise à jour de la convention

+0

Je ne suis pas sûr de quel côté de la barrière vous tombez ici car votre premier paragraphe suggère que vous utiliseriez différentes actions, mais votre exemple est la même action, avec différents verbes. Je vois que vous dites que l'une ou l'autre façon va bien, alors peut-être que vous avez donné les deux côtés à cause de cela? – Fenton

+0

Personnellement, je préfère utiliser Modifier/Mettre à jour car je crois que cela rend les intentions de l'action plus claires, mais je ne suis pas obligé de créer une application RESTful. Cependant, j'ai donné l'exemple si REST est une exigence de la vôtre. J'ai essayé de rendre cela un peu clair dans mon exemple. –

+0

Salut David - merci! – Fenton

Questions connexes