32

Apologies if the title is unclear.

I'm trying to return my model from a form submit in ASP.NET MVC.

My question is nearly the same as this question, only differing in that I don't have a List<Model> but a model like:

public Model
{
     string UserName {get; set;}
     string Password {get; set;}
     List<Roles> UserRoles {get; set;}
}

where I need the UserRoles as checkboxes that the admin can select from when creating a new user. My question is, I'm unsure how to use a '@Html.CheckBoxFor' against a list. I tried this:

 @for (var i = 0; i < Model.UserRoles.Count();i++ )
 {
   @Html.HiddenFor(model => model.UserRoles[i].RoleID)
   @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
   @Html.LabelFor(model => model.UserRoles[i].Name)
 }

which in no way worked - every label on the page is "Name", and my List was empty in the POST. Can anyone offer me any guidance on this?

1

4 Answers 4

56

No need to go away from Razor at all.

This works for me:

for (var i = 0; i < Model.UserRoles.Count(); i++)
{
    var role = Model.UserRoles[i];
    @Html.HiddenFor(model => model.UserRoles[i].RoleId)
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
    @Html.LabelFor(model=> model.UserRoles[i].Name, role.Name)
}
Sign up to request clarification or add additional context in comments.

3 Comments

This is nice but a small correction, that LabelFor should be bound to the same thing as the CheckBoxFor: @Html.LabelFor(model=> model.UserRoles[i].Selected, role.Name)
'Name' is not getting value after post
You may add @Html.HiddenFor(model => model.UserRoles[i].Name) in last to get the Name value after post
10

See below code, this way you don't need to hide the role Id, also when you save the selected roles for the user, you don't need to loop through all roles to see which role is selected.

View

@foreach (Roles info in Model.UserRoles)
{
    <span>
        <input type="checkbox" class="checkbox" name="selectedRoles" value="@info.RoleName" id="@infoRoleName" />
        <label for="@info.RoleName">@info.RoleName</label>
    </span>
}

Action

[HttpPost]
public ActionResult CreateUsers(Model model, string[] selectedRoles)
{
       //
}

4 Comments

You don't need to use native HTML. And how does a controller bind 2 models?!
I've used native HTML. But you literally can't bind two models. You can't. You just can't. You can't. (Did I mention that you can't). If you could, it would be called "MsVC".
hi @LiverpoolsNumber9, Have you ever see two submit buttons on MVC view, if you know how to solve that problem. you'll know how does this work.
Yeah, if you have two forms, you have two actions. Not two models. Child actions? Partials?
1

From your code in the view, the post should work fine providing your post action looks like this:

[HttpPost]
public ActionResult Action(Model model)
{
    return View(model);
}

i.e. passing your model across as the argument.

Also make sure you have your model reference in the view too:

@model YourNameSpace.Model

3 Comments

DisplayFor doesn't produce a label html element.
@liverpoolsnumber9 good point, I'm half asleep today. Deleted that part of my answer. :)
Ha ok. I sympathise :)
0

Post a list of check boxes to server and get list of checked items
linq left join to check whether checked, generating checkboxes,received checked list

View

    List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList();

    var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty()
              select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList();


    foreach (var item in li)
    {       
        @:<div style="width: 30%;  display: inline-block; margin: 1em">
        @:<input type="checkbox" @item.chkd name="CheckedCertificates" value="@item.Cert_id">
        @:<label>@item.Cert_Name</label>
        @:</div> 
    }

Controller

  [HttpPost]
    public ActionResult ManageSurveyGroup(int[] CheckedCertificates)
    {
        return View();
    }

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.