2011-07-01 2 views
0

私の会社のイントラネット用の最初のASP.NET MVC 3 Webサイトを作成しています。それはかなり涼しい、私は私たちの電話システムによって記録されたオーディオを再生し、DBに保存されます。それはうまくいっていますが、私は単純なやり方で何かをするのが難しいです。私がもっている可能性が高い構文エラーを許してください。これは大まかな草案です。MVC 3のWebサイトでの動的リンクの問題

私は、すべてのAppNameのリストと各AppNameの隣にある別のビューへのリンクを表示するテーブルを持っています。リンクのテキストは関連付けられたすべてのCallDetailsのCount()ですそのアプリで

Iは、2つのクラスがあります。これは、この部分でうまくのAppNameを表示

// AppsController 
private AppsContext db = new AppsContext(); 

public ViewResult Index() 
{ 
    return View(db.Apps.ToList()); 
} 
// CallController method (from my current attempt) 
public ActionResult CallCheck(int id) 
{ 
    bool? enabled = null; 

    var appcalls = from s in db.CallDetails 
        where s.AppID == id 
        && s.Enabled.Equals(enabled) 
        select s; 

    string callnum = appcalls.Count().ToString(); 

    return View(callnum); 
} 

:それぞれについて

public class Apps 
{ 
    public int AppId { get; set; } 
    public string AppName { get; set; } 
} 

public class CallDetail 
{ 
    public int Id { get; set; } 
    public int AppID { get; set; } 
    public byte[] FirstName { get; set; } 
    public byte[] LastName { get; set; } 
    ....etc 
} 

文脈:

public class AppsContext : DbContext 
{ 
    public DbSet<Apps> Apps { get; set; } 
} 

public class CallContext : DbContext 
{ 
    public DbSet<CallDetail> CallDetails { get; set; } 
} 

それぞれのコントローラ方法以下のViewのViewをクリックすると、関連付けられたCallDetailごとにViewへのリンクを作成できます。しかし、ViewのモデルはAppsとそのコントローラ、AppsControllerなので、CallDetail Controllerから得られる情報を表示する方法はわかりません。

@model IEnumerable<myMessagePlayer.Models.Apps> 
... 
@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.AppName) 
     </td> 
     <td class="appLink"> 
      ... 
     </td> 
    </tr> 
} 

は私が動作するように得ているかもしれない多くの異なる方法、いくつかを試してみたが、彼らは意味的に非MVCのように見えました。だから私は一般的なことを尋ねるだけだと思った "標準的な練習は何ですか?"質問のタイプ。

答えて

1

あなたが現在行っているパスは、データベースにある各アプリケーションのデータベースに当たることになります。すべての情報を1回のヒットでデータベースに表示する方法があります。

あなたのコンテキストは、これに変更する必要があります:あなたのような何かを行う必要があり、あなたのindexアクションで

public class AppCallInfo 
{ 
    public int AppID { get; set; } 
    public string AppName { get; set; } 
    public int CallCount { get; set; } 
} 

:あなたは3つのプロパティがありAppCallInfoと呼ばれるビューモデルオブジェクトを作成することができ

public class ApplicationContext : DbContext 
{ 
    public DbSet<Apps> Apps { get; set; } 
    public DbSet<CallDetail> CallDetails { get; set; } 
} 

これ:

public ViewResult Index() 
{ 
    var model = from a in db.Apps 
       join c in db.CallDetails on a.AppID equals c.AppID 
       where c.Enabled == enabled 
       group a by new { AppName = a.AppName, AppID = a.AppID } into g 
       select new AppCallInfo { 
        AppName = g.Key.AppName, 
        AppID = g.Key.AppID, 
        CallCount = g.Count() 
       }; 

    return View(model.ToList()); 
} 

これで、各行に必要なものすべて1つのオブジェクト内のテーブル。

@model List<myMessagePlayer.ViewModels.AppCallInfo> 
... 
@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.AppName) 
     </td> 
     <td class="appLink"> 
      @Html.ActionLink(item.CallCount, "ViewCalls", "Call", new { Id = item.AppID }, null) 
     </td> 
    </tr> 
} 

この方法を使用すると、あなたのテーブルを持っている各アプリケーションのためのデータベースを打つ避けることができます。

+0

私はこの昨晩のようなことをやり始めましたが、それがうまくいくかどうか、それとも「やるか」ということがわかりませんでした。そこからビルドする例がたくさんあります。だから、AppsとCallDetailsでコンテキストメソッドを同じにしておきたいのですか? –

+1

実際には、両方のオブジェクトを含むようにコンテキストを変更する必要があります。 (私の答えにこの変更を加えました)。これは正しいことです。この例は、ScottGuのブログ(http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx –

+0

)でご覧になれます。ありがとう、これを撃つだろう。 –

0

ビューCallCheckは部分的なビューですか?あなたは構文が100%正しいではないかもしれないが、それはあなたが正しい方向に行くを取得する必要があります

@Html.RenderAction("CallCheck", "AppsController", new { Id = @Model.AppId }) 

を使用することができ、あなたのインデックスビューで

関連する問題