MVC 3网站中的动态链接问题

时间:2011-07-01 15:23:19

标签: asp.net asp.net-mvc-3

我正在为我公司的内部网创建我的第一个ASP.NET MVC 3网站。这是非常酷的,我播放由我们的电话系统录制的音频并保存在我们的数据库中。这样做很好,但我很难搞清楚如何做一些简单的事情。请原谅我最有可能遇到的任何语法错误,这是草稿。

我在索引视图/应用程序中有一个列出所有AppName的表,并且在每个AppName旁边我想显示到另一个视图的链接,链接的文本是与所关联的所有CallDetails的Count()那个App。

我有两个班级:

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; }
}

每个的控制器方法:

// 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);
 }

它在下面的View部分显示AppName就好了,我可以为每个关联的CallDetail创建一个View的链接就好了。但我不知道如何显示我从CallDetail控制器获得的信息,因为View的模型是应用程序及其控制器,AppsController。

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

我尝试了很多不同的方法,有些方法我可能已经开始工作,但它们似乎在语义上不是MVC。所以我想我会问一般的“什么是标准做法?”问题的类型。

2 个答案:

答案 0 :(得分:1)

您当前正在关闭的路径最终会针对数据库中的每个应用程序访问数据库。有一种方法可以显示所有信息,只有一次命中数据库。

您的上下文需要更改为:

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

您可以创建一个名为AppCallInfo的视图模型对象,它具有三个属性:

public class AppCallInfo
{
    public int AppID { get; set; }
    public string AppName { get; set; }
    public int CallCount { 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());
}

现在,您可以在一个对象中拥有表中每一行所需的一切。

@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>
}

使用此方法可以避免为表中的每个应用程序访问数据库。

答案 1 :(得分:0)

视图CallCheck是局部视图吗?

在索引视图中,您可以使用

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

语法可能不是100%正确,但它应该让你朝着正确的方向前进。