Как получить доступ к свойству модели в представлении MVC?

Я борюсь с проблемой, которая кажется очень странной.

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'

Я не понимаю, почему он выдает ошибку, хотя у меня есть свойство в моей модели.


person Ammar Khan    schedule 27.10.2013    source источник
comment
Есть ли причина, по которой вы используете dynamic везде и не используете @model List<Tumblr> в верхней части кода Razor? Кроме того, знаете ли вы, что упомянули свойство как Phots?   -  person Adrian Wragg    schedule 28.10.2013
comment
См. здесь stackoverflow.com/questions/8820356/dynamic-type -in-mvc-представление   -  person glosrob    schedule 28.10.2013
comment
Привет, я добавил модель на свой взгляд, но это не повлияет. О «Фотах», написанных по ошибке. Сделайте это правильно, даже не решите проблему. Я все еще получаю ту же ошибку. Причина использования динамического, потому что я вызываю сторонний API tumblr. Если вы хотите посмотреть ответ json, см. здесь api.tumblr.com/v2/blog/puppygifs.tumblr.com/posts/   -  person Ammar Khan    schedule 28.10.2013
comment
Вы пытались использовать var вместо dynamic в своем foreach? Возможно, следующий foreach поймет, что он собирается повторять.   -  person Lars Anundskås    schedule 28.10.2013
comment
Да, я пробовал "вар", но безуспешно   -  person Ammar Khan    schedule 28.10.2013


Ответы (2)


Я уверен, что есть лучший способ сделать это, но если вы хотите оставить все как есть, измените код страницы просмотра следующим образом:

@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>
person Lin    schedule 28.10.2013

Вот пример того, как получить доступ к свойству из модели:

Вид:

@model Portal.ViewModels.LayoutViewModel
@Model.UserName

Просмотр модели:

namespace Portal.ViewModels
{
    public class LayoutViewModel
    {
        public String UserName { get; set; }
    }
}
person live-love    schedule 03.07.2019