0

我想使用MVC將3個單選按鈕值插入到數據庫中。 用戶需要選擇一種材料爲每個類別(牆,屋頂,地板)如何將多個RadioButtonFor值插入到數據庫中

enter image description here

目前用戶只能選擇一個值(可能需要做分組)。但是,當我只分組的structInfo值被插入到數據庫中。我需要將所有3值插入到數據庫中。

這是怎樣的數據庫設計的樣子 enter image description here

的結構INF(牆壁,屋頂,地板)的materialinfo是(bricks.concrete,樹林等)

這樣我就可以讓所有的用戶選擇保存到數據庫中的3個值?

這是我的看法

@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

你不能,至少不是沒有重新設計你的數據庫。您需要在您的'BuildingInfo'表,Walls','Roof'和'Floor'中包含對'MaterialInfo'的引用的2個字段,或者您需要第四個表作爲關係(包含'BuildingInfoId', StructInfoId'和'MaterialInfoId') –

+1

您的'MaterialInfo'模型似乎也不正確。它應該包含一個與'StructInfo'表的關係的屬性 –

+0

Oo,非常感謝Stephen,我可以在我的viewModel中創建關係嗎?你有沒有提及那個? – user3643092

回答

1

我GET方法

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

      return View(model); 
     } 
    } 

填充數據

 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; 
    } 

在查看

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) 
    } 

我POST方法

[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(); 
      } 
     } 
    } 

我總是收到此錯誤

System.NullReferenceException:對象不設置到對象的實例。

正確的代碼應該如何看起來像?謝謝。