2009-04-08 11 views
4

Comment créer une vue partielle avec un formulaire avec l'ID affecté? Je obtenu aussi loin que:ASP.NET MVC vue partielle et nom de l'action de formulaire

using (Html.BeginForm(?action?,"Candidate",FormMethod.Post,new {id="blah"})) 

Vue partielle est utilisée à la fois Créer et modifier si premier paramètre ?action? sera différent. Je ne peux pas comprendre quelle est la valeur de ?action? censé être.


MISE À JOUR:

Je suppose que je n'étais pas assez claire à la question. Ce que je fini par faire est le fractionnement Request.RawUrl pour obtenir le nom du contrôleur et le nom d'action:

string[] actionUrlParts = ViewContext.HttpContext.Request.RawUrl.Split('/'); 
using (Html.BeginForm(actionUrlParts.Length >= 2? actionUrlParts[2] : "", 
     actionUrlParts.Length >= 1 ? actionUrlParts[1] : "", FormMethod.Post, new { id = "blah" })) 

Type de laid, mais cela fonctionne. Existe-t-il un meilleur moyen d'obtenir un nom d'action dans la vue partielle? Passer l'action à effectuer via ViewData.

Répondre

7

Dans votre action qui affiche la vue, créez un élément ViewData pour l'action de publication. Dans votre formulaire, référencez cet élément ViewData pour renseigner le paramètre d'action. Vous pouvez également créer un modèle de vue uniquement qui inclut l'action et le modèle réel en tant que propriétés et le référencer à partir de là.

Exemple d'utilisation: ViewData

using (Html.BeginForm((string)ViewData["PostBackAction"], "Candidate", ... 

actions de rendu:

public ActionResult Create() 
{ 
    ViewData["PostBackAction"] = "New"; 
    ... 
} 


public ActionResult Edit(int id) 
{ 
    ViewData["PostBackAction'] = "Update"; 
    ... 
} 

Exemple d'utilisation Modèle

public class UpdateModel 
{ 
    public string Action {get; set;} 
    public Candidate CandidateModel { get; set; } 
} 

using (Html.BeginForm(Model.Action, "Candidate", ... 

Les actions de rendu:

public ActionResult Create() 
{ 
    var model = new UpdateModel { Action = "New" }; 

    ... 

    return View(model); 
} 


public ActionResult Edit(int id) 
{ 
    var model = new UpdateModel { Action = "Update" }; 

    model.CandidateModel = ...find corresponding model from id... 

    return View(model); 
} 

EDIT: Sur la base de votre commentaire, si vous pensez que cela devrait être fait dans la vue (même si je suis en désaccord), vous pouvez essayer une certaine logique basé sur l'ViewContext.RouteData

<% 
    var action = "Create"; 
    if (this.ViewContext.RouteData.Values["action"] == "Edit") 
    { 
     action = "Update"; 
    } 
    using (Html.BeginForm(action, "Candidate", ... 
    { 
%> 
+0

Cela fonctionne, mais je ne veux pas vraiment changer le code du contrôleur pour gérer quelque chose qui devrait être en mesure Vue de comprendre –

+0

j'ai ajouté ce remplacement est entièrement basées sur la vue , bien que je pense que le bon endroit pour contrôler l'action à poster serait dans le contrôleur. – tvanfosson

+0

Oui. C'est exactement ce que je cherchais. Le nom de l'action est dans ViewContext.RouteData.Values ​​["action"] –

0
<% html.RenderPartial("MyUserControl", Model.ID) %> 
+0

Bonjour, s'il vous plaît ne postez pas de code seulement les réponses, votre réponse pourrait être grandement améliorée avec une explication de ce que fait votre code et comment cela résout le problème d'OP. –

+0

Les réponses au code uniquement sont de qualité médiocre et peuvent être supprimées. Il doit toujours y avoir au moins une ou deux phrases (de façon optimale un paragraphe) à propos de la question à laquelle vous vous référez: hypothèses, conditions, pièges, etc. –

1

Passez les valeurs NULL en tant qu'action et contrôleur. L'extension utilise uniquement l'action en cours et le contrôleur de courant

using (Html.BeginForm(null, null, FormMethod.Post, new { id="Model" })) 

L'action générée pour le formulaire sera la même que la vue parente de cette vue partielle.

Il génère

<form action="/Orders/Edit/1" id="Model" method="post"> 

pour url http://localhost:1214/Orders/Edit/1

...et ce

<form action="/Orders/Create" id="Model" method="post"> 

pour url http://localhost:1214/Orders/Create

Questions connexes