CADAVID
CADAVID

Reputation: 93

pass an anonymous type to my ASP.NET MVC view

I have a problem, I have the next controller

namespace RolesMVC3.Areas.Administrador.Controllers
{
    [Authorize(Roles = "Adminr")]
    public class HomeController : Controller
    {
        private BASEDATOSCJ_2Entities db = new BASEDATOSCJ_2Entities();
        public ActionResult Index()
        {   
            string username = User.Identity.Name;
            MembershipUser user = Membership.GetUser(username);
            Guid key = (Guid)Membership.GetUser().ProviderUserKey;

            var Universities = (from u in db.UNIVERSITy
                                 join s in db.CAMPUS_UNIVERSITy on u.IdUniversity equals s.IdUniversity
                                 join c in db.CIUDAD_CAMPUS on s.IdCiudadSede equals c.IdCiudadSede
                                 join co in db.OFFICE on s.Idoffice equals co.Idoffice
                                 join uxc in db.USERxOFFICE on co.Idoffice equals uxc.Idoffice
                                 where uxc.UserId == key
                                 select new { u.Name, namecity = c.Nombre, s.Idoffice}).ToList();
            return View(Universities);
        }

With this controller I just want send to View u.Name, and s.Idoffice. How I do? (in fact do not know if this controllet is fine), I want to send fields belong to different tables. I want to send the query as a list and present at the View, ViewBag go with it?, How do I pass these data to the view and display with a foreach?.

I use razor

Upvotes: 1

Views: 6506

Answers (2)

Brendan Vogt
Brendan Vogt

Reputation: 26028

I would use a view model. I have learnt not to expose my domain objects to the view, I rather map my domain object to the view model and return this view model to the view.

Separate you data access logic from your view logic. You can put that whole statement into a repository class and then you just call this method from the controller.

Here is a partial view model, you might have more properties if you need more data to be displayed:

public class UniversityViewModel
{
     IEnumerable<University> Universities { get; set; }
}

University class:

public class University
{
     public string Name { get; set; }
     public string Idoffice { get; set; }
}

In my action method of my controller it would look something like this:

public ActionResult Index(int id)
{
     UniversityViewModel viewModel = new UniversityViewModel
     {
          Universities = universityRepository.GetAll()
     };

     return View(viewModel);
}

And in my view I would have the following:

<table>

@foreach(University university in Model.Universities)
{
     <tr>
          <td>Name:</td>
          <td>university.Name</td>
     </tr>
}

</table>

This is just a basic display of data in the view, you can use 3rd party components to display your data with some features.

Upvotes: 1

Ropstah
Ropstah

Reputation: 17794

If you change the following line:

select new { u.Name, namecity = c.Nombre, s.Idoffice}

To

select new { Name = u.Name, Idoffice = s.Idoffice }

This only selects the two fields into a list. In your view you can do the following:

@model List<dynamic>


@foreach(dynamic d in Model) {
    <p>@d.Name</p>
    <p>@d.Idoffice</p>
}

Edit:

You might want to define a ViewModel to contain your data.

public class MyViewModel {
    string Name {get;set;}
    string Idoffice {get;set;}
}

Now you can change your select statement as follows:

select new MyViewModel { Name = u.Name, Idoffice = s.Idoffice }

And update your Razor file as such:

@model List<MyViewModel>


@foreach(MyViewModel d in Model) {
    <p>@d.Name</p>
    <p>@d.Idoffice</p>
}

Upvotes: 3

Related Questions