【问题标题】:Asp.Net MVC 4 ModelAsp.Net MVC 4 模型
【发布时间】:2026-02-13 06:45:01
【问题描述】:

你好朋友,我在 mvc 4 中遇到问题,在 View 中发送动态模型建议我如何将动态模型与视图绑定

这是我的行动

[ChildActionOnly]

    public ActionResult TopArticles()
    {
        var model = from a in db.Articles.Take(3).OrderBy(m=>m.TotalViews) 
                    join u in db.UserProfiles 
                        on a.CreatedBy equals u.ID 
                    join t in db.Tags 
                        on a.TagID equals t.ID 
                    select new 
                    { 
                        Title = a.Title,
                       ArticleID = a.ArticleID, 
                        FirstName = u.FirstName, 
                        CreatedBy = a.CreatedBy, 
                        TagID = a.TagID, 
                        TagName = t.Name, 
                        CreationDate = a.CreationDate, 
                        TotalViews = a.TotalViews 
                    };  // get Top 3 Articles from Articles
        return PartialView(model);
    }

这是我的观点

 @model IEnumerable<dynamic>
@{
    ViewBag.Title = "TopArticles";   
}
@foreach(dynamic item in Model)
{
   <div class="row about_topviewedarticle1">
   <div class="row">
     <div class="columns twenty">
     <a href="#" class="title">@item.Title</a>
by   <a href="#"class="profilefont_eleven">@item.FirstName</a>
                    </div>
                </div>
                <div class="row">
                    <div class="columns twenty">
                        <label class="font_ten">views: @item.TotalViews  posted on : @item.CreationDate</label>
                    </div>
                </div>
            </div>
            }

当我运行此代码时,出现以下错误

“对象”不包含“标题”的定义

【问题讨论】:

  • 你必须制作一个视图模型,例如ArticlesViewModel,它将包含您要显示的 Articles 实体的这一部分。之后在查询中您将...选择新的 ArticlesViewModel { ... }。最后将视图模型传递给视图。

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


【解决方案1】:

第一种方式

试试这个

var model = from a in db.Articles.Take(3).OrderBy(m=>m.TotalViews) 
                    join u in db.UserProfiles 
                        on a.CreatedBy equals u.ID 
                    join t in db.Tags 
                        on a.TagID equals t.ID 
                    **select new Article**
                    { 
                        Title = a.Title,
                       ArticleID = a.ArticleID, 
                        FirstName = u.FirstName, 
                        CreatedBy = a.CreatedBy, 
                        TagID = a.TagID, 
                        TagName = t.Name, 
                        CreationDate = a.CreationDate, 
                        TotalViews = a.TotalViews 
                    };

根据David Ebbo,您不能将匿名类型传递给动态类型视图,因为匿名类型被编译为内部类型。由于 CSHTML 视图被编译为单独的程序集,因此它无法访问匿名类型的属性。

See this discussion

或者,

第二种方式

立即将匿名对象转换为 ExpandoObject。

public static ExpandoObject ToExpando(this object anonymousObject)
{
    IDictionary<string, object> anonymousDictionary =  new RouteValueDictionary(anonymousObject);
    IDictionary<string, object> expando = new ExpandoObject();
    foreach (var item in anonymousDictionary)
        expando.Add(item);
    return (ExpandoObject)expando;
}



 var model = from a in db.Articles.Take(3).OrderBy(m=>m.TotalViews) 
                        join u in db.UserProfiles 
                            on a.CreatedBy equals u.ID 
                        join t in db.Tags 
                            on a.TagID equals t.ID 
                      select new 
                        { 
                            Title = a.Title,
                           ArticleID = a.ArticleID, 
                            FirstName = u.FirstName, 
                            CreatedBy = a.CreatedBy, 
                            TagID = a.TagID, 
                            TagName = t.Name, 
                            CreationDate = a.CreationDate, 
                            TotalViews = a.TotalViews 
                        }**.ToExpando()**;

引用自herehere

【讨论】: