Man8Blue
Man8Blue

Reputation: 1197

How to pass multiple model in view in ASP.NET MVC?

Problem is: I want to run 3 different actions but instead of that i want to fed all data from single action in a bigger model.

I am using:

public class SearchScrapClass
    {
        public WClass WClass { get; set; }
        public SClass SClass { get; set; }
        public YClass YClass { get; set; }
    }

    public class WClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }
    public class SClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }
    public class YClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }

I am using LINQ to add data in these models.

I am using :

      var wikians = from info in document.DocumentNode.SelectNodes("//div[@id='span']")
        from link in info.SelectNodes("div//a").Where(x => x.Attributes.Contains("href"))
         select new SearchScrapClass //Main Bigger Class
         {
            WClass.link= link.Attributes["href"].Value, //ERROR: How to add to WClass's url ?
            WClass.title= link.InnerText //ERROR: How to add to WClass's url ?
         }


var wikians = from info in document.DocumentNode.SelectNodes("//div[@id='results']")
               from link in info.SelectNodes("p//a").Where(x => x.Attributes.Contains("href"))
               select new SearchScrapClass //Main Bigger Class
                 {
                   YClass.link= link.Attributes["href"].Value, //ERROR: How to add to YClass's url ?
                   YClass.title= link.InnerText //ERROR: How to add to YClass's url ?
                 }

//Also for the 3rd class (model)


    return View(wikians); //and then return bigger class model so that i can access them in view

This is one way i want to add data to link and title of all the classes.

My try is to add data to all 3 classes from different sources and pass the bigger model to view so that i can access all the classes as:

@model SearchScrapClass
@using(Html.BeginForm()) {
    @Html.EditorFor(o => o.WClass.link)
    ...
}

Please suggest a way

Thanks

Upvotes: 7

Views: 15101

Answers (4)

Rajamohan Anguchamy
Rajamohan Anguchamy

Reputation: 1736

See the tuple tutorial http://www.dotnetperls.com/tuple or this one http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

Like controller:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var first = new FirstModel();
        var second = new SecondModel();
        return View(Tuple.Create(first,second));
    }
}

And the view:

@model Tuple

<div> 
    @Model.Item1.FirstModelProp
    @Model.Item2.SecondModelProp
</div>

Upvotes: 1

user3604506
user3604506

Reputation: 1

SearchScrapClassViewModel model = new SearchScrapClassViewModel
{
    ....add in your logic to fill your class objects here


}

what logic we apply here " ....add in your logic to fill your class objects here"

Upvotes: 0

Brian
Brian

Reputation: 2229

To Expand on my comment, I would suggest creating a ViewModel folder for organization sake. in this add the view model

public class SearchScrapClassViewModel
{
    SearchScrapClass searchScrap;
    WClass wClass;
    SClass sClass;
    YClass yClass;
}

In your controller then you instantiate the new viewmodel

SearchScrapClassViewModel model = new SearchScrapClassViewModel
{
    ....add in your logic to fill your class objects here


}

return view(model);

then in your view add the using for the viewmodel.

@using SearchScrapClassViewModel

Upvotes: 8

Imran Rashid
Imran Rashid

Reputation: 3492

You can pass multiple model by creating a new model class which will contain multiple objects.

public class MultiModel 
    {
     SearchScrapClass searchScrap;
     WClass wClass;
     SClass sClass;
     YClass yClass;
    }

Upvotes: 1

Related Questions