web-dev-qa-db-ja.com

ASP.Net MVC:ビューからメソッドを呼び出す

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

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

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

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

ここで間違った質問をしている可能性があることを理解しています。答えはおそらくそうではなく、ローカルモデルを使用して、外部APIから取得したオブジェクトをローカルモデルにデシリアライズし、ローカルモデルで「特別なフォーマット」を実行してから渡す必要があるということです。ビューにそれ。しかし、代わりにビューからメソッドを呼び出すことができる何らかの方法があることを望んでいます。主に、APIから取得するカスタムオブジェクト(他の多くのカスタムオブジェクトを含む)を、作成するローカルカスタムオブジェクトに変換するのはオーバーヘッドが大きいように思われるためです。また、それを行うための最善の方法が何であるかはわかりません。

免責事項:同様のスレッド「ASP.NET MVC:ビューからコントローラーメソッドを呼び出す」を知っています( ASP.NET MVC:ビューからコントローラーメソッドを呼び出す )それが私の質問に答えます。

53
doosh

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

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

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

@{
    SomeClass.Method();
}

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

86
lahsrah

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

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)
18
viperguynaz

ビューから呼び出されることになっていないコントローラー。これがMVCの全体像です-懸念の明確な分離。

Viewからコントローラーを呼び出す必要がある場合は、何か問題があります。リファクタリングの時間。

4
Illidan

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

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

またはHTMLヘルパーの場合

@Html.MehtodName()
4
Amine Chafai

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');
                    }
                });
            }
2

私はlashrahの答えを試してみましたが、構文を少し変更した後に機能しました。これは私のために働いたものです:

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

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

1
tkestowicz

ビューからコントローラーを呼び出さないでください。

ビューモデルにプロパティを追加し、コントローラーで設定して、ビューで使用します。

以下に例を示します。

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