如何在MVC View中访问Model属性?

时间:2013-10-27 20:20:20

标签: asp.net-mvc tumblr asynchttpclient

我正在努力解决一个看似非常奇怪的问题。

1)我有一个名为'Tumblr'的课程

public class Tumblr
{
    public string BlogName { get; set; }
    public dynamic PhotosCollection { get; set; }
}

2)我的控制器中有一个方法

 public ActionResult Index()
 {
     var model = new List<Tumblr>();
     var client = new HttpClient();
     var task = client.GetAsync("http://api.tumblr.com/v2/blog/puppygifs.tumblr.com/posts/photo?api_key=SbvxQcWuuNr1mfRvILKKTqiztMGvR8hbGPBDA9PlMidrYdd8Ik")
                    .ContinueWith((taskWithMsg) =>
                     {
                         var response = taskWithMsg.Result;
                         var jsonTask = response.Content.ReadAsAsync<JObject>();
                         jsonTask.Wait();

                         var jsonResponse = jsonTask.Result;
                         model = FillModel(jsonResponse, model)
                     });
      task.Wait();
      return View(model);
  }

  private List<Tumblr> FillModel(dynamic jsonObject, List<Tumblr> model)
  {
      var postObject = (JArray)jsonObject["response"].posts;
      var posts = postObject.Select(e => new Tumblr()
                  {
                      BlogName = e["blog_name"].ToString(),
                      PhotosCollection = e["photos"].Select(o => new
                      {
                          Photos = o["alt_sizes"].Select(s => new
                          {
                              Width = s["width"].ToString(), 
                              Height = s["width"].ToString(),
                              Url = s["width"].ToString(),
                          })
                      })
                  });
      model.AddRange(posts);
      return model;
  }

这是我的观点

@using System.Collections
@{
    ViewBag.Title = "Home Page";
}


<ol class="round">
@foreach (dynamic blog in Model)
{
    <li class="one">
        <h5>@blog.BlogName</h5>
        <span>@blog.PhotosCollection</span>
        <hr />
        <hr />
        <hr />
        @foreach (dynamic photos in blog.PhotosCollection)
        {
            foreach (var photo in photos.Photos)
            {
                <img src="@photo.Url" width="@photo.Width" height="@photo.Height"/>
            }
        }
        <hr />
    </li>
}
</ol>

当我尝试运行时,它会抛出错误

'object' does not contain a definition for 'Photos'

我不明白为什么即使我的模型中有属性也会抛出错误。

2 个答案:

答案 0 :(得分:1)

我确信有更好的方法可以做到这一点,但如果您想保持原样,请更改您的视图页面代码:

@model dynamic
@{
    ViewBag.Title = "Home Page";
}
<ol class="round">
    @foreach (dynamic blog in Model)
    {
        <li class="one">
            <h5>@blog.BlogName</h5>
            <span>@blog.PhotosCollection</span>
            <hr />
            <hr />
            <hr />

            @foreach (dynamic p in blog.PhotosCollection)
            {
                var photos = p.GetType().GetProperty("Photos").GetValue(p, null);
                foreach (var photo in photos)
                {
                    var url = photo.GetType().GetProperty("Url").GetValue(photo, null);
                    var width = photo.GetType().GetProperty("Width").GetValue(photo, null);
                    var height = photo.GetType().GetProperty("Height").GetValue(photo, null);

                    <img src="@url" width="@width" height="@height"/>
                }
            }
            <hr />
        </li>
    }
</ol>

答案 1 :(得分:0)

以下是如何从模型访问属性的示例:

查看:

@model Portal.ViewModels.LayoutViewModel
@Model.UserName

查看模型:

namespace Portal.ViewModels
{
    public class LayoutViewModel
    {
        public String UserName { get; set; }
    }
}