web-dev-qa-db-fra.com

ASP.Net MVC: appel d'une méthode à partir d'une vue

Dans mon application MVC, le contrôleur extrait les données (modèle) d'une API externe (aucune classe de modèle n'est donc utilisée) et les transmet à la vue. Les données (modèle) ont un conteneur dans lequel il y a plusieurs objets avec plusieurs champs (valeurs de chaîne). Une vue itère sur chaque objet et appelle une autre vue pour en dessiner chacun. Cette vue parcourt les champs (valeurs de chaîne) et les dessine.

Voici où cela devient difficile pour moi. Parfois, je souhaite effectuer un formatage spécial sur les champs (valeurs de chaîne). Je pourrais écrire 20 lignes de code pour le formatage, mais je devrais le faire pour tous les domaines et ce serait simplement ridicule et tellement moche. Au lieu de cela, j'aimerais prendre le champ (valeur de chaîne), le transmettre à une méthode et obtenir une autre valeur de chaîne. Et ensuite faire cela pour chaque domaine.

Alors, voici ma question:

Comment appeler une méthode depuis une vue?

Je me rends compte que je pose peut-être la mauvaise question ici. La réponse est probablement que non, et que je devrais utiliser un modèle local et désérialiser l'objet que je reçois de l'API externe vers mon modèle local puis, dans mon modèle local, effectuer la "mise en forme spéciale" avant de passer. à la vue. Mais j'espère qu'il est possible d'appeler une méthode à partir d'une vue. Principalement parce que la conversion de l'objet personnalisé fourni par l'API, qui contient à son tour de nombreux autres objets personnalisés, en beaucoup d'objets, semble être une surcharge en objets personnalisés locaux que je construis. Et aussi, je ne suis pas sûr de ce que la meilleure façon de faire serait.

Clause de non-responsabilité: Je connais le fil de discussion similaire "ASP.NET MVC: appel d'une méthode de contrôleur depuis une vue" ( ASP.NET MVC: appel d'une méthode de contrôleur depuis une vue ), mais je ne vois pas comment cela répond à ma question.

49
doosh

Voici comment appeler une méthode d'instance sur le contrôleur:

@{
  ((HomeController)this.ViewContext.Controller).Method1();
}

Voici comment vous appelez une méthode statique dans n'importe quelle classe 

@{
    SomeClass.Method();
}

Cela fonctionnera si la méthode est publique et visible pour la vue.

81
lahsrah

En vous appuyant sur la réponse d’Amine, créez un assistant tel que:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString CurrencyFormat(this HtmlHelper helper, string value)
    {
        var result = string.Format("{0:C2}", value);
        return new MvcHtmlString(result);
    }
}

à votre avis: utilisez @Html.CurrencyFormat(model.value)

Si vous utilisez un formatage simple comme Formats numériques standard , utilisez simplement string.Format () dans votre vue, comme dans l'exemple d'aide ci-dessus:

@string.Format("{0:C2}", model.value)
17
viperguynaz

Vous pouvez implémenter une méthode de formatage statique ou un assistant HTML, puis utilisez cette syntaxe:

@using class_of_method_namespace
...
// HTML page here
@className.MethodName()

ou en cas de HTML Helper

@Html.MehtodName()
4
Amine Chafai

Le contrôleur n'est pas censé être appelé de vue. C’est l’idée même de MVC - séparation claire des préoccupations.

Si vous devez appeler le contrôleur depuis View, vous faites quelque chose de mal. Temps pour le refactoring.

3
Illidan

pourquoi vous n'utilisez pas Ajax pour 

sa simple et ne nécessite pas page refresh et a success and error callbacks

regarde ma samlpe

<a id="ResendVerificationCode" >@Resource_en.ResendVerificationCode</a>

et dans JQuery

 $("#ResendVerificationCode").on("click", function() {
                getUserbyPhoneIfNotRegisterd($("#phone").val());
 });

et ceci est mon ajax qui appelle mon contrôleur et mon contrôleur et retourne un objet de la base de données

function getUserbyPhoneIfNotRegisterd(userphone) {

              $.ajax({
                    type: "GET",
                    dataType: "Json",
                    url: '@Url.Action("GetUserByPhone", "User")' + '?phone=' + userphone,
                    async: false,
                    success: function(data) {
                        if (data == null || data.data == null) {
                            ErrorMessage("", "@Resource_en.YourPhoneDoesNotExistInOurDatabase");
                        } else {
                            user = data[Object.keys(data)[0]];
                                AddVereCode(user.ID);// anather Ajax call 
                                SuccessMessage("Done", "@Resource_en.VerificationCodeSentSuccessfully", "Done");
                        }
                    },
                    error: function() {
                        ErrorMessage("", '@Resource_en.ErrorOccourd');
                    }
                });
            }
2
Basheer AL-MOMANI

Vous devez créer un assistant personnalisé pour changer simplement le format de chaîne, sauf en utilisant l'appel du contrôleur.

1
tkestowicz

J'ai essayé la réponse de Lashrah et cela a fonctionné après un changement de syntaxe un peu… .. c'est ce qui a fonctionné pour moi:

@(
  ((HomeController)this.ViewContext.Controller).Method1();
)
0
bthn