【问题标题】:C# - Using multiple data calls in an ASP.NET MVC 3 viewC# - 在 ASP.NET MVC 3 视图中使用多个数据调用
【发布时间】:2011-06-16 00:38:02
【问题描述】:

我正在尝试使用 razor 学习 ASP.NET MVC 3,到目前为止已经掌握了窍门。

我坚持的一件事是尝试让多个数据调用正常工作。

我正在做的事情的背景。我有一个页面将显示有关项目的信息(我正在工作),但我也想显示该项目的进度(这是另一个数据调用)。我无法显示进度数据。我尝试使用 viewbag,但得到了:

System.Data.Objects.ObjectResult`1[System.String]

我在实体框架中使用存储过程。

感谢各位的帮助。

编辑:

这是我的问题的一个粗略示例:

private SDMPREntities _db = new SDMPREntities();
public ActionResult Details(int id) { 
ViewData.Model = _db.ViewProjectDetails(id).ToList();
ViewBag.Progress = _db.ProjectProgress();
return View();
} 

EDIT2:

@James D'Angelo,在视图中是的。这是剃须刀代码:

@model IEnumerable<DeveloperManagerSharp.Models.Projects>

@{
ViewBag.Title = "Project Details";
Layout = "~/Views/Shared/project-ui.cshtml";
}

<div class="post">
<h3 class="title">
    Project Details</h3>
<div class="entry">
    <h4>
        Select a Project</h4>
    <p>
        Select a project below to see their progress or to update any of their properties.</p>
</div>
</div>

@foreach (var item in ViewData.Model)
{    
<div class="post">
    <h3 class="title">@item.project_name (@item.project_version) @ViewBag.Progress%</h3>
    <div class="meta">
        <div class="posted">
            @Html.ActionLink("Edit", "Edit", new { id = item.PID }) |
            @Html.ActionLink("Back to Projects", "Index")
        </div>
        @if (@item.project_completed == "1") {
            <div class="date">
                Project is Completed.
            </div>
            } else {
            <div class="date">
                Project is Under Work.
            </div>       
            }
    </div>
    <div class="entry">
        @if(@item.project_status == "0")
            {
            <span>Status: Planning</span><br />
            }
            else if(@item.project_status == "1")
            {
            <span>Status: Alpha</span><br />
            }
            else if(@item.project_status == "2")
            {
            <span>Status: Beta</span><br />
            }
            else if(@item.project_status == "3")
            {
            <span>Status: Release Candiate</span><br />
            }
            else if(@item.project_status == "4")
            {
            <span>Status: Active</span><br />
            }
            else if(@item.project_status == "5")
            {
            <span>Status: Maure</span><br />
            }
            else if(@item.project_status == "6")
            {
            <span>Status: Discontinued</span><br />
            }
        Starts: @item.project_sdate<br />
        Ends: @item.project_edate<br />
        <em>@item.project_desc</em>
    </div>
</div>
}

【问题讨论】:

  • 你能发布一些你所说的不起作用的代码吗?
  • 当然。私有 SDMPREntities _db = 新 SDMPREntities(); public ActionResult Details(int id) { // 从数据库中检索流派及其相关专辑 ViewData.Model = _db.ViewProjectDetails(id).ToList(); ViewBag.Progress = _db.ProjectProgress();返回视图(); }
  • 现在我的实体函数可能是错误的,我让它返回为十进制,因为它只返回一个小数。
  • 请编辑您的问题,而不是在 cmets 中发布代码。
  • 你从哪里得到“System.Data.Objects.ObjectResult`1[System.String]”?在视图中?如果是这样,你能把剃刀也贴出来吗?

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


【解决方案1】:

电话

_db.ProjectProgress();

很可能返回一个 ObjectResult,它表示项目的集合。

所以当你试图在视图中显示它时

@ViewBag.Progress

ToString() 被调用,它只是打印出类型。

要解决此问题,您需要从集合中获取特定结果。在不知道您的数据结构的情况下,我只能冒险猜测,例如

_db.ProjectProgress().Single(p=>p.ProjectId == id)

【讨论】:

    【解决方案2】:

    尝试以下操作。

    数据层代码

     public class ProjectDetailManager 
     {   
       public static List<ViewProjectDetail> GetProjectDetailById(int id)    
       {
           using(var dbContext = new SDMPREntities())
           {
              return dbContext.ViewProjectDetails(id).ToList();
           }    
        }
    
        public static ProjectProgress GetProjectProgress(int id)    
        {
           using(var dbContext = new SDMPREntities())
           {
              return dbContext.ProjectProgress().Where(x=>x.ProjectId ==id).FirstOrDefault();
           }    
        }
    
     }
    

    控制器代码:

    public ActionResult Details(int id) 
    {
      ViewData.Model = ProjectDetailManager.GetProjectDetailById(id); 
       ViewBag.Progress = ProjectDetailManager.GetProjectProgress(id);
       return View();    
    }
    

    查看代码

         @model IEnumerable<ViewProjectDetail> 
        @{
            ViewBag.Title = "Project Details";
            Layout = "~/Views/Shared/_SiteContent.cshtml";
         }
    @// not sure what your object look like but here an example 
        <h1>Project Status: @(ViewBag.Progress != null ? ViewBag.Progress.Status : string.Empty)</h1>
    
           @foreach(var item in Model) 
           {     
              //format display whatever 
           }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多