it-swarm.com.de

ASP.Net MVC: Aufrufen einer Methode aus einer Ansicht

In meiner MVC-App erhält der Controller die Daten (Modell) von einer externen API (es wird also keine Modellklasse verwendet) und übergibt diese an die Ansicht. Die Daten (Modell) haben einen Container, in dem sich mehrere Objekte mit mehreren Feldern (String-Werten) befinden. Eine Ansicht durchläuft jedes Objekt und ruft eine andere Ansicht auf, um die einzelnen Objekte zu zeichnen. Diese Ansicht durchläuft die Felder (Zeichenfolgenwerte) und zeichnet sie.

Hier wird es schwierig für mich. Manchmal möchte ich eine spezielle Formatierung der Felder vornehmen (Zeichenfolgenwerte). Ich könnte 20 Zeilen Code für die Formatierung schreiben, aber dann müsste ich das für jedes Feld tun und das wäre einfach dumm und ach so hässlich. Stattdessen möchte ich das Feld (Stringwert) nehmen, an eine Methode übergeben und einen anderen Stringwert zurückgeben. Und dann machen Sie das für jedes Feld.

Also hier meine Frage:

Wie rufe ich eine Methode aus einer Sicht auf?

Mir ist klar, dass ich hier vielleicht die falsche Frage stelle. Die Antwort ist wahrscheinlich, dass ich dies nicht tue und dass ich ein lokales Modell verwenden und das Objekt, das ich von der externen API bekomme, für mein lokales Modell deserialisiert und dann in meinem lokalen Modell die "spezielle Formatierung" vor dem Pass durchführen es zur Ansicht. Ich hoffe jedoch, dass es eine Möglichkeit gibt, stattdessen eine Methode aus einer Sicht aufzurufen. Meistens scheint es viel Aufwand zu sein, das benutzerdefinierte Objekt, das ich von der API bekomme, die wiederum viele andere benutzerdefinierte Objekte enthält, in lokale benutzerdefinierte Objekte umzuwandeln, die ich baue. Und ich bin mir auch nicht sicher, wie man das am besten macht.

Haftungsausschluss: Ich kenne den ähnlichen Thread "ASP.NET MVC: Aufrufen einer Controller-Methode aus Sicht" ( ASP.NET MVC: Aufrufen einer Controller-Methode aus Ansicht ), aber ich sehe nicht, wie das meine Antworten beantwortet Frage.

49
doosh

So rufen Sie eine Instanzmethode auf dem Controller auf:

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

So rufen Sie eine statische Methode in einer Klasse auf 

@{
    SomeClass.Method();
}

Dies funktioniert unter der Annahme, dass die Methode öffentlich und für die Ansicht sichtbar ist.

81
lahsrah

Aufbauend auf Amines Antwort erstellen Sie einen Helfer wie:

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

in deiner Sicht: benutze @Html.CurrencyFormat(model.value)

Wenn Sie einfache Formatierungen wie Standard Numeric Formats durchführen, verwenden Sie einfach string.Format () in Ihrer Ansicht wie im obigen Helfer-Beispiel:

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

Sie können eine statische Formatierungsmethode oder einen HTML-Helfer implementieren und dann diese Syntax verwenden:

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

oder im Fall von HTML Helper

@Html.MehtodName()
4
Amine Chafai

Controller sollte nicht aus der Sicht aufgerufen werden. Das ist die ganze Idee von MVC - klare Trennung der Bedenken.

Wenn Sie den Controller von View aus anrufen müssen, tun Sie etwas falsch. Zeit zum Refactoring.

3
Illidan

warum verwenden Sie nicht Ajax zu 

es ist einfach und erfordert page refresh nicht und hat success and error Rückrufe

schau dir meine samlpe an

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

und in JQuery

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

und dies ist mein Ajax, der meinen Controller und meinen Controller anruft und ein Objekt aus der Datenbank zurückgibt

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

Sie sollten einen benutzerdefinierten Helfer erstellen, um nur das String-Format zu ändern, mit Ausnahme des Controller-Aufrufs.

1
tkestowicz

Ich habe die Antwort von Lashrah ausprobiert und es hat funktioniert, nachdem ich die Syntax ein wenig geändert hatte ...

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

Sie sollten keinen Controller aus der Ansicht aufrufen.

Fügen Sie Ihrem Ansichtsmodell eine Eigenschaft hinzu, legen Sie sie im Controller fest und verwenden Sie sie in der Ansicht.

Hier ist ein Beispiel:

MyViewModel.cs:

public class MyViewModel
{   ...
    public bool ShowAdmin { get; set; }
}

MyController.cs:

public ViewResult GetAdminMenu()
    {
        MyViewModelmodel = new MyViewModel();            

        model.ShowAdmin = userHasPermission("Admin"); 

        return View(model);
    }

MyView.cshtml:

@model Proj.ViewModels.MyViewModel


@if (@Model.ShowAdmin)
{
   <!-- admin links here-->
}
0
live-love