MVC 3 Edit data in a IEnumerable Model View

I’m trying to edit a list of items in a strongly-typed razor view. The templates don’t give me the option to edit a list of objects in a single view so I merged the List view with the Edit view. I only need to edit one boolean field in a checkbox.
The problem is that i cant get the data back to the controller. How do i do it? FormCollection? Viewdata? Thanks in advance.

Here’s the code:

Models:

public class Permissao
{
    public int ID { get; set; }
    public TipoPermissao TipoP { get; set; }
    public bool HasPermissao { get; set; }
    public string UtilizadorID { get; set; }
}

public class TipoPermissao
{
    public int ID { get; set; }
    public string Nome { get; set; }
    public string Descricao { get; set; }
    public int IndID { get; set; }
}

Controller Actions:

    public ActionResult EditPermissoes(string id)
    {
        return View(db.Permissoes.Include("TipoP").Where(p => p.UtilizadorID == id));
    }

    [HttpPost]
    public ActionResult EditPermissoes(FormCollection collection)
    {
        //TODO: Get data from view
        return RedirectToAction("GerirUtilizadores");
    }

View:

@model IEnumerable<MIQ.Models.Permissao>

@{
    ViewBag.Title = "EditPermissoes";
}

@using (Html.BeginForm())
{
    <table>

    <tr>
        <th></th>
        <th>
            Indicador
        </th>
        <th>
            Nome
        </th>
        <th>Descrição</th>
        <th></th>
    </tr>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.CheckBoxFor(modelItem => item.HasPermissao)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TipoP.IndID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TipoP.Nome)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TipoP.Descricao)
            </td>
        </tr>
    }
</table> 
<p>
   <input type="submit" value="Guardar" />
 </p>
}

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

How do i do it? FormCollection? Viewdata?

None of the above, use the view model:

[HttpPost]
public ActionResult EditPermissoes(IEnumerable<Permissao> model)
{
    // loop through the model and for each item .HasPermissao will contain what you need
}

And inside your view instead of writing some loops use editor templates:

<table>
    <tr>
        <th></th>
        <th>
            Indicador
        </th>
        <th>
            Nome
        </th>
        <th>Descrição</th>
        <th></th>
    </tr>
    @Html.EditorForModel()
</table>

and inside the corresponding editor template (~/Views/Shared/EditorTemplates/Permissao.cshtml):

@model Permissao
<tr>
    <td>
        @Html.CheckBoxFor(x => x.HasPermissao)
    </td>
    <td>
        @Html.DisplayFor(x => x.TipoP.IndID)
    </td>
    <td>
        @Html.DisplayFor(x => x.TipoP.Nome)
    </td>
    <td>
        @Html.DisplayFor(x => x.TipoP.Descricao)
    </td>
</tr>


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x