【问题标题】:Accessing Linq Values in ViewData在 ViewData 中访问 Linq 值
【发布时间】:2010-03-19 12:33:40
【问题描述】:

我在访问 ViewData 中的 idareatheme 值时遇到问题。

它们正在我的操作过滤器中设置,但是当我到达 Site.Master 时,我无权访问它们。

任何帮助或建议都会很棒。

动作过滤器

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    int SectionID = Convert.ToInt32(filterContext.RouteData.Values["Section_ID"]);
    int CourseID = Convert.ToInt32(filterContext.RouteData.Values["Course_ID"]);

        if (CourseID == 0)
        {
            filterContext.Controller.ViewData["Styles"] = (from m in _dataContext.Styles where m.Area_ID == SectionID select new {theme = m.Area_FolderName }).ToList();
        }
        else
        {
            filterContext.Controller.ViewData["Styles"] = (from m in _dataContext.Styles where m.Course_ID == CourseID select new { theme = m.Course_FolderName }).ToList();
        }
    }
}

Site.Master

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<%@ Import Namespace="Website.Models" %>

    <%       
        foreach (var c in (IEnumerable<Styles>)ViewData["Styles"])
       {
        Response.Write(c.Theme);
    }%>

【问题讨论】:

  • 如果您将对 Website.Models 命名空间的引用添加到 web.config 的命名空间部分,则不需要在页面中声明,因为它将在全球范围内注册。

标签: asp.net-mvc linq


【解决方案1】:

根据您的反馈重新编辑...

我认为最好通过创建 ViewModel 来为您服务,这样您就可以强类型化您的视图。

创建如下类(可根据需要添加字段):

public class StyleViewModel
{
    public string Id {get; set;}
    public string Area {get; set;}
    public string Theme {get; set;}
}

然后在你的控制器中:

filterContext.Controller.ViewData["Styles"] = 
    (from m in _dataContext.Styles 
    where m.Area_ID == SectionID
    select new StyleViewModel
    {
        Id = m.Area_ID
        Area = m.Area_Name
        Theme = m.Area_FolderName
    }).ToList();

然后您可以清理视图中的代码:

<% 
    foreach (var c in Model)
    {
        Response.Write(c.Theme);
    }
%>

【讨论】:

  • 感谢您的快速回复。我仍然无法访问 Site.Master 中的值吗?我的数据库名称得到了智能感知,但匿名类型却没有?
  • 你需要使用匿名类型吗?
  • 我确实需要使用匿名类型,因为根据 SectionID 或 CourseID 是什么,我无法从数据库中为主题字段提供不同的值..
  • 这似乎是一个更好的解决方案,干净的视图。我现在收到一个错误,尽管我的 site.master foreach 语句无法对“object”类型的变量进行操作,因为“object”不包含“GetEnumerator”的公共定义
  • 我的猜测是您没有完全正确地使您的母版页成为强类型...查看这篇文章的说明:stackoverflow.com/questions/768236/…
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多