2011-06-15 3 views
0

Salut je suis nouveau MVC RazorMVC rasoir Boutons

Je tentais de faire une page avec 3 insert Bouton, supprimer et mettre à jour.

Mon point de vue ressemble

 <div>  
      @using (Html.BeginForm()) 
      { 

       <input type="button" class="button1" value="Insert" /> 
       <input type="button" class="button1" value="Delete" /> 
       <input type="button" class="button1" value="Update" /> 
      } 
     </div> 

Et mon contrôleur est comme

 public ActionResult Index() 
     { 
       return View(); 
     } 

Comment je vais obtenir les événements de ce bouton dans mon contrôleur afin que je serai en mesure d'écrire la logique pour chaque bouton. Aidez-moi s'il vous plaît à obtenir le codage ou n'importe quel lien approprié qui aidera à résoudre ce problème.

Merci San

Répondre

2

[modifier]

re-itterate mon point dans les commentaires sur les autres réponses: lorsque vous liez LOGIC à la valeur d'un bouton en C# vous liez votre code C# pour cette langue.

Imaginez que vous avez le bouton Enregistrer dans la version anglaise:

<input type="submit" value="Insert" name='button' /> 

et dans votre code que vous allez passer en utilisant la valeur:

public ActionResult Index(string button) 
{ 
    switch (button) 
    { 
     case "Insert": ... 
     case "Update": ... 
     case "Delete": ...  
    } 

    return View(); 
} 

maintenant - quand cette forme est considérée dans une autre langue - que pensez-vous qu'il va se passer?!?!

est ici la sortie welsh html:

<input type="submit" value="Mewnosod" name='button' /> 

et allemand:

<input type="submit" value="Einfügen" name='button' /> 

Comment est-ce jamais à travailler ?!

La mondialisation n'est pas une issue distincte !!!!

votre action ressemblera à ceci si vous utilisez cette méthode:

public ActionResult Index(string button) 
{ 
    switch (button) 
    { 
     case "Insert": ... 
     case "Update": ... 
     case "Delete": ...  
     case "Einfügen": ... 
     case "Mewnosod": .... 
     .... a load of other languages for each action type - 
    } 

    return View(); 
} 

... s'il vous plaît sérieusement ....

[/ modifier]

Voici mon code d'action MVC Sélecteur : Asp.Net Mvc action selector

essentiellement, vous avez besoin d'une classe de sélecteur d'action:

/// <summary> 
/// AcceptParameterAttribute to enable submit buttons to execute specific action methods. 
/// </summary> 
public class AcceptParameterAttribute : ActionMethodSelectorAttribute 
{ 
    /// <summary> 
    /// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller. 
    /// </summary> 
    public string Action { get; set; } 
  
    /// <summary> 
    /// Determines whether the action method selection is valid for the specified controller context. 
    /// </summary> 
    /// <param name="controllerContext">The controller context.</param> 
    /// <param name="methodInfo">Information about the action method.</param> 
    /// <returns>true if the action method selection is valid for the specified controller context; otherwise, false.</returns> 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
        if (controllerContext == null) 
        { 
            throw new ArgumentNullException("controllerContext"); 
        } 
  
        var req = controllerContext.RequestContext.HttpContext.Request; 
  
        return req.Form.AllKeys.Contains(this.Action); 
  
    } 
} 

Ce qui fonctionne sur le nom que vous donnez au bouton.

Vous pouvez décorer les actions avec:

[AcceptParameter(Action = "Edit")] 
public ActionResult Person_Edit(PersonViewModel model){ 
... 
} 

Commutation dans l'action est sale - c'est une approche beaucoup plus propre. Je pense beaucoup plus naturel aussi.

+0

voici une version mise à jour de ce code avec support de liste (databound): http://blogs.sonatribe.com/wayne/2011/06/15/171/ – iwayneo

+0

J'ai essayé cela ... Mais je suis obtenir un message d'erreur Comme "Sample.Controllers.AcceptParameterAttribute" ne contient pas un constructeur qui prend 1 arguments " – san

+0

ooops désolé! mon erreur - vous devez utiliser la méthode optionnelle args: [AcceptParameter (Action = "Edit")] – iwayneo

5

Donnez les boutons un nom:

<div>  
@using (Html.BeginForm()) 
{ 
    <input type="button" name="button" class="button1" value="Insert" /> 
    <input type="button" name="button" class="button1" value="Delete" /> 
    <input type="button" name="button" class="button1" value="Update" /> 
} 
</div> 

et l'utiliser dans votre action:

public ActionResult Index(string button) 
{ 
    switch (button) 
    { 
     case "Insert": ... 
     case "Update": ... 
     case "Delete": ...  
    } 

    return View(); 
} 

Avec tout ce que dit, je ne voudrais pas utiliser cette approche . Je modifierais l'action de formulaire à la volée à différentes actions de contrôleur (en utilisant Url.Action) en accroissant ce code pour cliquer sur des gestionnaires utilisant jQuery.

+3

+1 seulement pour cette dernière phrase . C'est pourquoi je déteste les formulaires Web - pas à cause de la technologie, à cause de la façon dont la pensée axée sur les événements a endoctriné les développeurs Web .net, nous avons complètement oublié ce que le HTTP est tout au sujet. les développeurs de MVC doivent essentiellement désapprendre beaucoup de leur vision de la forme des web. – RPM1984

+0

-1 parce que l'interrupteur est sale! bien que je suis +1 sur le commentaire ci-dessus :) – iwayneo

+1

cette option brise également si le site est multilingue - qui est ce que le web est pour non? – iwayneo

0

Je vous suggère de lire un tutoriel simple sur MVC3 - il vous donnera l'occasion de comprendre les principes de base de la structure MVC. Vous pouvez commencer here.

Maintenant à votre question: la meilleure approche consiste à appeler à partir de chaque bouton une action dans le contrôleur.

@Html.ActionLink("Insert", "Insert") 

ou

@Html.ActionLink("Edit", "Edit", new{Id=lineId}). 

Ensuite, lorsque l'utilisateur clique sur ce lien - il aura à corriger vue, qui est prêt à gérer cette tâche.

+0

comment pensez-vous que cela va poster à une action? HTTP GET n'est pas un POST ?! – iwayneo

+0

Pourquoi pensez-vous qu'il est POST nécessaire? – VikciaR

+0

De quelle autre manière les champs de formulaires seront-ils envoyés au serveur? avez-vous mal compris l'intention du PO? – iwayneo

0

Voici amélioré AcceptParameterAttribute, si vous utilisez la localisation que je

public class AcceptParameterAttribute : ActionMethodSelectorAttribute 
{ 
    public string Name { get; set; } 
    public Type ResourceType { set; get; } 
    public string Value { get; set; } 

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request; 
     if (ResourceType != null) 
     { 
      ResourceManager resourceManager = new ResourceManager(ResourceType); 
      return request.Form[Name] == resourceManager.GetString(Value); 
     } 
     return request.Form[Name] == Value; 
    } 
} 

Utilisation similaire à DisplayAttribute

[AcceptParameter(ResourceType = typeof(Resources), Name = "submit", Value = "Search")] 

et le bouton

<input type="button" name="submit" value="@Resources.Search" />