41

I have a List<> binded with some data in Controller action and I want to pass that List<> to View to bind with DataGrid in Razor View.

I am new to MVC.Can any one help me how to pass and how to access in View.

1
  • Summing up the answers so far. You can use for this: 1 - Using View(), 2 - Using ViewData, 3 - Using ViewBag, 4 - Using your custom class, and 5 - Some combinations of those approaches. Commented Jul 1, 2022 at 12:47

5 Answers 5

55

Passing data to view is simple as passing object to method. Take a look at Controller.View Method

protected internal ViewResult View(
    Object model
)

Something like this

//controller

List<MyObject> list = new List<MyObject>();

return View(list);


//view

@model List<MyObject>

// and property Model is type of List<MyObject>

@foreach(var item in Model)
{
    <span>@item.Name</span>
}
Sign up to request clarification or add additional context in comments.

4 Comments

Worked for me when I had @Model instead of @model.
what if you want to send 2 separate lists from controller to view?
Than you should create ViewModel class that has two List properties and pass instance of that class to view
is there are any way for fetch data without foreach loop and simply we write model => model.Data @archil
14

I did this;

In controller:

public ActionResult Index()
{
  var invoices = db.Invoices;

  var categories = db.Categories.ToList();
  ViewData["MyData"] = categories; // Send this list to the view

  return View(invoices.ToList());
}

In view:

@model IEnumerable<abc.Models.Invoice>

@{
    ViewBag.Title = "Invoices";
}

@{
  var categories = (List<Category>) ViewData["MyData"]; // Cast the list
}

@foreach (var c in @categories) // Print the list
{
  @Html.Label(c.Name);
}

<table>
    ...
    @foreach (var item in Model) 
    {
      ...
    }
</table>

Hope it helps

2 Comments

what if you want to send 2 separate lists to View from Controller?
Hi @RehanKhan, I think you should you make then 2 viewdata with 2 different names. ViewData["MyList1"] and ViewData["MyList2"] Best regards.
9

You can use the dynamic object ViewBag to pass data from Controllers to Views.

Add the following to your controller:

ViewBag.MyList = myList;

Then you can acces it from your view:

@ViewBag.MyList

// e.g.
@foreach (var item in ViewBag.MyList) { ... }

7 Comments

This is the worst way data is passed from controller to view
Yes, but it's the easiest as well.
I would not agree. Magic strings with viewbag are easier than return View(model)?
It's complex magic in the background and surely not foolproof. But from a beginner's POV it's one of the simplest possible solutions. I like your answer better and will happily give it a +1 but will leave mine for reference.
I'm just critically against using viewbag/viewdata, and prefer using viewmodels :)
|
7
  1. Create a model which contains your list and other things you need for the view.

    For example:

    public class MyModel
    {
        public List<string> _MyList { get; set; }
    }
    
  2. From the action method put your desired list to the Model, _MyList property, like:

    public ActionResult ArticleList(MyModel model)
    {
        model._MyList = new List<string>{"item1","item2","item3"};
        return PartialView(@"~/Views/Home/MyView.cshtml", model);
    }
    
  3. In your view access the model as follows

    @model MyModel
    foreach (var item in Model)
    {
       <div>@item</div>
    }
    

I think it will help for start.

1 Comment

Nice approach. And you can pass as many list types as you want inside the model to the view.
0

Here's Some ways to pass model list or data from controller to view in c# .net mvc

The First One using SelectListItem

Controller :

[HttpGet]
   public IActionResult Create()
   {
       IEnumerable<SelectListItem> list = context.Villas.ToList().Select(n => new SelectListItem
       {
           Text = n.Name,
           Value = n.Id.ToString()
       });

       ViewData["VillaList"] = list;

       return View();
   }

View :

<div class="form-floating py-1 col-12">
     <select asp-for="@Model.VillaId" asp-items="@ViewData["VillaList"] as IEnumerable<SelectListItem>" class="form-control border shadow" >
             <option disabled selected> Select Villa </option>
     </select>
     <label asp-for="VillaId" class="ms-2"></label>
     <span asp-validation-for="VillaId" class="text-danger"></span>
 </div>

The Second One using ViewBag for dynamic data

Controller :

[HttpGet]
  public IActionResult Create()
  {
      IEnumerable<SelectListItem> list = context.Villas.ToList().Select(n => new SelectListItem
      {
          Text = n.Name,
          Value = n.Id.ToString()
      });

      ViewBag.VillaList = list;

      return View();
  }

View :

<div class="form-floating py-1 col-12">
    <select asp-for="@Model.VillaId" asp-items="@ViewBag.VillaList" class="form-control border shadow">
            <option disabled selected> Select Villa </option>
    </select>
    <label asp-for="VillaId" class="ms-2"></label>
    <span asp-validation-for="VillaId" class="text-danger"></span>
</div>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.