views:

38

answers:

2

I'm trying to build an ASP.NET MVC 2 application. I want to pass data to a view from a controller. I am able to pass it when it is only a single data structure. In the controller:

 private ArticlesDBEntities _db = new ArticlesDBEntities();

    public ActionResult Articles()
    {
        return View(_db.ArticleSet.ToList());
    }

and in the view, I iterated over the list like so:

<div id="demo1"> 
<% foreach (var item in Model) { %>
    <ul> 
        <li id="<%= Html.Encode(item.Id) %>"> 
            <a href="#"><%= Html.Encode(item.Title) %></a> 
            <ul> 
                <li id="phtml_2"> 
                    <a href="#">Child node 1</a> 
                </li> 
                <li id="phtml_3"> 
                    <a href="#">Child node 2</a> 
                </li> 
            </ul> 
        </li> 
    </ul> 
    <% } %>
</div> 

(the child nodes are for testing reasons right now, don't have a real role)

However, I now want to handle a scenario when a user tries to access Home/Articles/Id, and not only pass the article list (used for populating a jsTree), but also the Article itself, so I can show it as well. However, when I tried creating a ViewData object like so:

    public ActionResult Articles()
    {
        ViewData["articlesList"] = _db.ArticleSet.ToList();
        return View();
    }

I was unable to find out how to iterate over it in the view.

A: 

In your View you should be able to do

<% foreach(var item in ViewData["articlesList"]) %>

An alternative approach would be to create a new view model class that would hold both the article and the list:

class ArticleViewModel {
   public Article Article { get;set;}
   public IEnumerable<Article> Articles { get;set;}
}

and pass that into your view. Then you can access it through the Model property and you will get strong typing.

marcind
+1  A: 

as far as passing multiple data items is concerned u can do it using view models (preferred way) or by viewdata. if u want to pass it through View model u can do something like

public class ArticlVM
{
   public Article Myarticle{get;set;}
   public IEnumerable<ArticleSet> Artcileset{get; set;}
}

u can populate this view model and pass it to view

in view u can access it like

<%=Model.Article.articlName%> 
<%=Model.Article.articlDescription%> 
<%foreach(var m in Model.Articleset){%>
   <label><%=m.Property1%></label>
<%}%>

to iterate over ViewData["key"] u have to cast it to corresponding object like

<%=foreach(var m in (ArticleSet)ViewData["Articles"]){%>

<label><%=m.Property1%></label>
<%}%>
Muhammad Adeel Zahid
thank you very much! but how exactly do I "populate this view model" in the controller?
Tom Teman
Ok, I managed to populate the view model. However, I then try to access it in the view, but when I write "Model", the intellisense doesn't allow me to choose "Article" or "Articleset". Am I missing an #include or "using" or a <@page ...> in the view or somewhere else?
Tom Teman
Ok, added the inherits="..." and now it works! :-)
Tom Teman