从ViewBag枚举时遇到问题

时间:2012-12-30 17:21:32

标签: c# asp.net-mvc razor

我正在传递给我的Razor观点:

public ActionResult NewsList()
{
  ViewBag.News = _client.GetNews(Guid.Parse(GetCookieInfo.TokenId));
  return View();
}

我的GetNews是这样的:

public IEnumerable<TokenNews> GetNews(Guid tokenid)
{
  var nl = from news in entities.News
         where news.TokenId == tokenid &&
               DateTime.Now > news.Expiration &&
               news.IsActive
         orderby news.OrderNumber
         select new News
                  {
                    NewsTitle = news.NewsTitle,
                    NewsBody = news.NewsBody,
                    OrderNumber = news.OrderNumber
                  };

  var newslist = new List<TokenNews>();
  foreach (var news in nl)
  {
    var nw = new TokenNews();
    nw.Body = news.NewsBody;
    nw.Title = news.NewsTitle;
    newslist.Add(nw);
  }
  return newslist;
}

我的TokenNews是这样的:

  [DataContract]
  public class TokenNews
  {
    private string title = string.Empty;
    private string body = string.Empty;

    public string Title {
      get { return title; }
      set { title = value; }
    }
    public string Body
    {
      get { return body; }
      set { body = value; }
    }
  }

我的NewsList.cshtml视图如下所示:

@using SuburbanCustPortal.SuburbanService

<br />

         @foreach (var nws in (IEnumerable<TokenNews>) ViewBag.News)
         {

           <div  class="leftdiv">
             <br/>
             <label class="sizedCustomerlabel">
               @nws.Body
             </label>
           </div>
         }

我的问题是@nws.Body。 nws没有给我TokenNews中的标题或正文。

它给我的信息是:

  

无法解析符号正文。

这一定是我忽略了一百次,但我无法理解。

有什么建议吗?

更新

回应Umar Farooq Khawaja:

我按照你的表现做了,这就是发生的事情:

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要将DataMember属性应用于公共属性的TokenNews课程。请记住为之后使用SuburbanCustPortal.SuburbanService类的TokenNews服务重新生成客户端。我还使用自动生成的属性而不是私有字段支持的属性,只是为了使代码更清晰。

[DataContract]
public class TokenNews
{
    [DataMember]
    public string Title
    {
        get;
        set;
    }

    [DataMember]
    public string Body
    {
        get;
        set;
    }
}

如果这不起作用,请先尝试将ViewBag.News存储在静态类型变量中,然后使用新的静态类型引用对其进行迭代,例如

<br />
@{
    var news = (IEnumerable<TokenNews>)ViewBag.News;
}
@foreach (var item in news)
{
<div class="leftdiv">
    <br />
    <label class="sizedCustomerLabel">
        @item.Body
    </label>
</div>
}

此外,您可以通过以下方式重构以下方法:

public IEnumerable<TokenNews> GetNews(Guid tokenid)
{
    var newslist = from news in entities.News
                   where news.TokenId == tokenid &&
                         DateTime.Now > news.Expiration &&
                         news.IsActive
                   orderby news.OrderNumber
                   select new TokenNews
                   {
                       Title = news.NewsTitle,
                       Body = news.NewsBody
                   };

    return newslist.ToArray();
}