2013-10-27 4 views
0

Я борюсь с проблемой, которая кажется очень странной.Как получить доступ к собственности модели в представлении 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' 

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

+1

Есть ли причина, что вы используете ' dynamic's везде и не используя '@model List ' в верхней части вашего кода Razor? Кроме того, знаете ли вы, что вы ссылались на свойство как «Фото»? –

+0

См. Здесь http://stackoverflow.com/questions/8820356/dynamic-type-in-mvc-view – glosrob

+0

Привет, я добавил модель на мой взгляд, но это не будет иметь никакого эффекта. О «Фото», которые были написаны по ошибке. Правильно, даже не разрешайте проблему. Я все еще получаю ту же ошибку. Причина использования динамического, потому что я вызываю стороннюю api tumblr. Если вы хотите посмотреть ответ json, см. Здесь http://api.tumblr.com/v2/blog/puppygifs.tumblr.com/posts/photo?api_key=SbvxQcWuuNr1mfRvILKKTqiztMGvR8hbGPBDA9PlMidrYdd8Ik – user2866746

ответ

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> 
Смежные вопросы