cg91
cg91

Reputation: 467

Enable boolean and enter text in view then pass back to controller - MVC

I have a view that displays a boolean (currently defaulted to 0) in a box format in the view that I cannot check to activate as true and also want to enter text in the result field to pass back to the controller and save both changes to a table. Can someone please explain what I have to do to allow this functionality to work please.

enter image description here

Controller code

public ActionResult P1A1Mark()
    {
        List<MarkModel> query = (from row in db.submits
                                     where row.assignment_no.Equals("1") && row.group_no == 1
                                     group row by new { row.assignment_no, row.student_no, row.student.firstname, row.student.surname } into g
                                     select new MarkModel
                                     {
                                         student_no = g.Key.student_no,
                                         student_surname = g.Key.surname,
                                         student_firstname = g.Key.firstname

                                     }
                                        ).ToList();

        return View(query);
    }

View

@model IEnumerable<MvcApplication2.Models.MarkModel>

@{
    ViewBag.Title = "P1A1Mark";
}

<h2>Mark Student Assignments</h2>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.student_no)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.student_surname)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.student_firstname)
        </th>
         <th>
            @Html.DisplayNameFor(model => model.submitted)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.result)
        </th>

        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.student_no)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.student_surname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.student_firstname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.submitted)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.result)
        </td>

    </tr>
}

</table>

Model

    public class MarkModel
{
    public string student_no { get; set; }
    public string student_surname { get; set; }
    public string student_firstname { get; set; }
    public string assignment_no { get; set; }
    public bool submitted { get; set; }
    public string result { get; set; }
    public Nullable<int> group_no { get; set; }
}

Upvotes: 5

Views: 297

Answers (1)

user3559349
user3559349

Reputation:

Create an EditorTemplate for type of MarkModel.

In /Views/Shared/EditorTemplates/MarkModel.cshtml

@model MvcApplication2.Models.MarkModel
<tr>
  <td>@Html.DisplayFor(m => m.student_no)</td>
  <td>@Html.DisplayFor(m => m.student_surname)</td>
  <td>@Html.DisplayFor(m => m.student_firstname)</td>
  <td>@Html.CheckBoxFor(m => m.submitted)</td>
  <td>@Html.TextBoxFor(m => m.result)</td>
</tr>

and in the main view

@model IEnumerable<MvcApplication2.Models.MarkModel>
@using (Html.BeginForm())
{
  <table>
    <thead>
      // add your th elements
    </thead>
    <tbody>
      @Html.EditorFor(m => m)
    <tbody>
  </table>
  <input type="submit" ../>
}

and create a method to post back to

[HttpPost]
public ActionResult P1A1Mark(IEnumerable<MarkModel>model)

Alternatively you can use a for loop in the view (the model must be IList<T>)

for(int i = 0; i < Model.Count; i++)
{
  ....
  @Html.CheckBoxFor(m => m[i].submitted)
}

Upvotes: 1

Related Questions