How to insert multiple RadioButtonFor value into database

247 Views Asked by At

I want to insert 3 value of radio button into Database using MVC. User need to select one material for each categories(Walls,Roof,Floor)

enter image description here

Currently the user can only select one value (may need to do grouping).But when I do grouping only the structInfo value is inserted into database. I need all the 3 value inserted into database.

This is how the database design look like enter image description here

the struct inf(walls,roof,floor) the materialinfo is (bricks.concrete,woods, etc)

So can I make all the 3 value choosed by user save into database?

This is my view

 @foreach (var structIN in Model.structInfo)
                {
                    if (structIN.structId.Equals(1))
                    {
                        @Html.Label(structIN.structNm) @:   

                        foreach (var material in Model.materialInfo)
                        {
                            if (material.materialId.Equals(1) || material.materialId.Equals(2) || material.materialId.Equals(3))
                            {
                                @Html.RadioButtonFor(model => model.buildInfo.materialId, material.materialId)@Html.Label(material.materialNm)
                                @Html.HiddenFor(model => model.buildInfo.structId, new { Value = structIN.structId })

                            }

                        }
                    }

                    else if(structIN.structId.Equals(2))
                    {
                        <br />
                        @Html.Label(structIN.structNm) @:&nbsp; &nbsp;

                        foreach (var material2 in Model.materialInfo)
                        {
                            if (material2.materialId.Equals(2) || material2.materialId.Equals(4) || material2.materialId.Equals(5))
                            {
                                @Html.RadioButtonFor(model2 => model2.buildInfo.materialId, material2.materialId)@Html.Label(material2.materialNm)
                                @Html.HiddenFor(model2 => model2.buildInfo.structId, new { Value = structIN.structId })

                            }

                        }
                    }
                    else if (structIN.structId.Equals(3))
                    {
                        <br />
                        @Html.Label(structIN.structNm) @:&nbsp; &nbsp;

                        foreach (var material3 in Model.materialInfo)
                        {
                            if (material3.materialId.Equals(6) || material3.materialId.Equals(3))
                            {
                                @Html.RadioButtonFor(model3 => model3.buildInfo.materialId, material3.materialId)  @Html.Label(material3.materialNm)
                                @Html.HiddenFor(model3 => model3.buildInfo.structId, new { Value = structIN.structId })

                             }
                        }
                }
                }
1

There are 1 best solutions below

0
user3643092 On

my GET method

 [HttpGet]
    public ActionResult RegisterForm()
    {
        PopulateStructMaterialData();
        using (var dataBase = new TMXEntities())
        {
            var model = new RegisterInfoPA()
            {
                //OTHER CODES
            };

            return View(model);
        }
    }

Populating Data

        private void PopulateStructMaterialData()
    {
        var list = new List<strucMaterial>
        {
            new strucMaterial{ifOthers = "", materialId = 1, materialNm = "Bricks", structId = 1, structNm = "Walls", insuranceReqId = 0, isSelected = false},
            new strucMaterial{ifOthers = "", materialId = 2, materialNm = "Concrete", structId = 1, structNm = "Walls", insuranceReqId = 0, isSelected = false},
            new strucMaterial{ifOthers = "", materialId = 3, materialNm = "Woods", structId = 1, structNm = "Walls", insuranceReqId = 0, isSelected = false},

            new strucMaterial{ifOthers = "", materialId = 2, materialNm = "Concrete", structId = 2, structNm = "Roof", insuranceReqId = 0, isSelected = false},
            new strucMaterial{ifOthers = "", materialId = 4, materialNm = "Tiles", structId = 2, structNm = "Roof", insuranceReqId = 0, isSelected = false},
            new strucMaterial{ifOthers = "", materialId = 5, materialNm = "Zinc", structId = 2, structNm = "Roof", insuranceReqId = 0, isSelected = false},

            new strucMaterial{ifOthers = "", materialId = 3, materialNm = "Woods", structId = 3, structNm = "Floor", insuranceReqId = 0, isSelected = false},
            new strucMaterial{ifOthers = "", materialId = 6, materialNm = "Reinforced Concrete", structId = 3, structNm = "Floor", insuranceReqId = 0, isSelected = false},

        };
       ViewBag.populatebuilding = list;
    }

In View

  List<Insurance.ViewModels.strucMaterial> viewModelSM = ViewBag.populatebuilding;
  for(int i=0; i<viewModelSM.Count; i++)
  {
                    @Html.DisplayFor(m => viewModelSM[i].structNm)
                    @Html.HiddenFor(m => viewModelSM[i].structId)

                    @Html.CheckBoxFor(m => viewModelSM[i].isSelected)

                    @Html.HiddenFor(m => viewModelSM[i].materialId)
                    @Html.Label(viewModelSM[i].materialNm)
  }

My POST method

 [HttpPost]
    public ActionResult RegisterForm(RegisterInfoPA viewmodel, List<strucMaterial> list)
    {
        using (var dataBase = new TMXEntities())
        {
            var model = new RegisterInfoPA()
            {
              //OTHER CODES
            };

            if (ModelState.IsValid)
            {
                //OTHER CODES
                var register = viewmodel.reg;
                var personalinfo = viewmodel.pinfo;

                //Save Register
                db.registers.Add(register);
                db.SaveChanges();
                //Retriving required Id's
                var getid = register.registrationId;
                var getRegTypeID = register.regisTypeId;

                //SAVE PERSONAL INFO
                personalinfo.registrationId = getid;
                db.personalInfoes.Add(personalinfo);
                db.SaveChanges();

              //---HOW SHOULD I SAVE THE CHECKBOX HERE?-----------                                  
              **> tHIS IS MY CODE, BUT IT IS NOT WORKING**
                foreach(var item in list) (<< error starts here)
                {
                    buildingInfo.materialId = item.materialId;
                    buildingInfo.structId = item.structId;
                    buildingInfo.insuranceReqId = item.insuranceReqId;
                    db.buildingInfoes.Add(buildingInfo);
                }
                db.SaveChanges();
            }
       }
    }

I am always getting this error

System.NullReferenceException: Object reference not set to an instance of an object.

How the proper code should look like? Thank you.