2017-11-23 6 views
0

私は現在、MVC 5ベースのプロジェクトに取り組んでいます。今度は、データベースから少数のテキストコンテンツを取得するために、API呼び出しを行って、テキストをビューで使用するようにしました。ここで私のビューは基本的にシンプルな形式で、テキストのほとんどがデータベースから来ています。MVCビューにC#ベースのコードを配置する場所はどこですか?

ページを読み込んでいるうちに、ページが読み込まれている間にイメージが最初に読み込まれないことがわかりました。私はキャッシュからのデータの特定のリストを格納しているAPI呼び出しを使用して、データベースからのイメージパスを持ってきています。

今、私はどこにAPIを呼び出すべきかわかりません。 APIを呼び出してデータを取得するための共通の関数を作成しました。私は

1から選択するオプションを持っている

<img src="@myfunctioncall" style="max-height:50px;" /> 

2私のイメージタグ内Src属性内に直接電話の発信)ビューの上部には、C#のブロックの中で、変数を宣言し、APIを呼び出して、その変数を画像タグ内のSrc属性内で使用する必要があります。

@{ 
string myVal = myfunctioncall; 
} 

はその後、私のimgタグ内myValを使用ビューの上に

.........Code...... 
<img src="@myVal" style="max-height:50px;" /> 
.........Code...... 

私は、ページがレンダリングされるかわからないですし、ジョブを取得するための最良のアプローチがあります完了しました。

+0

atのビューにはいけません。メソッドへの呼び出しはコントローラ内になければなりません(テストすることができます)。その呼び出しの結果を含むモデルをビューに渡します。 –

+0

ビューはコードロジックを扱うように設計されていないため、ロジックタスクはコントローラーアクションメソッドで処理する必要があります。あなたはそれを行うためにビューモデルを利用することができます。 –

答えて

1

としてViewBagを使用することができます見る:

1)モデルのビルド:

public class MyModel 
{ 
    public string ImagePath {get;set;} 
    //other properties 
} 

2)コントローラ:

public class MyController:Controller 
{ 
    public ActionResult Index() 
    { 
     MyModel model = new MyModel(); 
     model.ImagePath = //here get it from service 
     return View(model); 
    } 
} 

3)表示:あなたが追加する必要があるビューの最初の行で

<img src="@Model.ImagePath" style="max-height:50px;" /> 

@model MyModel 

別(示唆されていない)オプションは次のとおりです。

ViewBag強く型付けされていないタイプですdynamicこれは、タイプミスなどのエラーがビルドプロセスではなくランタイムで検出されることを意味します。

コントローラー:

public class MyController:Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.ImagePath = //your service call 
     return View(); 
    } 
} 

ビュー:


<img src="@ViewBag.ImagePath" style="max-height:50px;" /> 
Viewでサービスコールを置く考えは同じくらい愚かなことになって View MVCパターン、違反です可能。 単なる表現レイヤーです。

+0

私はこのアプローチをとてもよく知っています。私の見解の問題は、それが多くの場所で共有されていることです。私は同じモデルに対して何の制約もしていませんが、すでにモデルには自分のプロパティがロードされているため、現在表示しているモジュールに新しいプロパティを追加できません。別のアプローチでは、ViewDataと言いますが、私は個人的にはそれを好まないのです。 –

+0

ViewModelを作成して、必要なものを追加し、Modelをプロパティとして保持するとどうなりますか?それは一般的である可能性があります。例:public T Model {get; set;}とパブリック文字列ImagePath {get; set;}とそれを使用しますか? – MadOX

0

最も良い方法は、コントローラですべての操作を行い、ビューとしてModelとして渡すオブジェクトを作成することです。

あなたの見解では、あなたのフィールドを埋めるためにモデルを使用することができます。

2

コントローラでは、データベースからデータを取得し、ビューバッグをViewBag.Path= imagePath;として作成する必要があります。imagePathは、データベースから取得したパス値を含むC#文字列変数です。あなたは正しいアプローチである<img src="@ViewBag.Path" style="max-height:50px;" />

関連する問題