62

私の MVC アプリでは、コントローラーが外部 API からデータ (モデル) を取得し (モデル クラスが使用されていないため)、それをビューに渡します。データ (モデル) には、複数のフィールド (文字列値) を持つ複数のオブジェクトが含まれるコンテナーがあります。1 つのビューが各オブジェクトを繰り返し処理し、別のビューを呼び出してそれぞれを描画します。このビューは、フィールド (文字列値) を反復処理して描画します。

ここが私にとって難しいところです。フィールド (文字列値) に特別な書式を設定したい場合があります。書式設定用に 20 行のコードを書くこともできますが、すべてのフィールドに対してそれを行う必要があり、それはばかげたものであり、非常に醜いものです。代わりに、フィールド (文字列値) を取得してメソッドに渡し、別の文字列値を取得したいと考えています。そして、すべてのフィールドに対してそれを行います。

だから、ここに私の質問があります:

ビューからメソッドを呼び出すにはどうすればよいですか?

ここで間違った質問をしている可能性があることに気づきました。答えはおそらく、そうではなく、ローカル モデルを使用し、外部 API から取得したオブジェクトをローカル モデルに逆シリアル化してから、ローカル モデルで「特別な書式設定」を行ってから渡す必要があるということです。それをビューに。しかし、代わりにビューからメソッドを呼び出す方法があることを願っています。その主な理由は、API から取得したカスタム オブジェクト (他の多くのカスタム オブジェクトを含む) を、私が構築したローカル カスタム オブジェクトに変換するのは、多くのオーバーヘッドがあるように思われるからです。また、それを行う最善の方法が何であるかはわかりません。

免責事項: 同様のスレッド「ASP.NET MVC: コントローラー メソッドをビューから呼び出す」( ASP.NET MVC: ビューからコントローラー メソッドを呼び出す) を認識していますが、それが私の質問にどのように答えるかわかりません。

4

8 に答える 8

102

これは、コントローラーでインスタンス メソッドを呼び出す方法です。

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

これは、任意のクラスで静的メソッドを呼び出す方法です

@{
    SomeClass.Method();
}

これは、メソッドがパブリックであり、ビューに表示されていると仮定して機能します。

于 2013-03-13T23:08:07.577 に答える
23

アミンの答えに基づいて、次のようなヘルパーを作成します。

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

あなたの見解で:使用@Html.CurrencyFormat(model.value)

Standard Numeric Formatsのような単純な書式設定を行っている場合は、上記のヘルパーの例のように、ビューでstring.Format()を単純に使用します。

@string.Format("{0:C2}", model.value)
于 2013-03-13T23:31:52.347 に答える
5

静的フォーマットメソッドまたはHTMLヘルパーを実装してから、次の構文を使用できます。

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

またはHTMLヘルパーの場合

@Html.MehtodName()
于 2013-03-13T23:10:14.427 に答える
2

なぜあなたは慣れていないのですAjax

そのシンプルで、コールバックを必要page refreshとせず、持っていますsuccess and error

私のサンプルを見てください

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

そしてJQueryで

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

これは私のコントローラーと私のコントローラーを呼び出し、データベースからオブジェクトを返す私のajaxです

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');
                    }
                });
            }
于 2016-09-04T11:16:32.563 に答える
1

コントローラ呼び出しを使用する場合を除いて、文字列形式を変更するだけのカスタムヘルパーを作成する必要があります。

于 2013-03-13T23:17:59.413 に答える