2014-07-11 97 views
0

我開發一個管理員工隊伍的應用程序,我用Razor使用MVC4 Asp.net。MVC 4綁定多個模型asp剃鬚刀

在我的模型中,我有兩個班級(誰是我的數據庫中的表格)和業餘(培訓人員)。

在我的應用程序中,我可以創建一個「編組」,我想添加一個「形成」(培訓師)列表,但我不知道我必須做什麼。 我認爲最好的解決方案是複選框列表,我成功地用foreach顯示了我的複選框列表,但我不知道如何讓選定複選框的結果傳入我的控制器。

我看到很多使用「CheckBoxList」的教程,我也嘗試使用,但是我使用ViewBag來填充它,但他們沒有解釋如何將它與viewbag一起使用。

現在我測試一個雙列表框與兩個按鈕(添加和刪除),但這是行不通的。

那麼,有人可以幫助我找到並解釋我必須怎麼做,好的或最好的解決方案?

我很抱歉我的英語,我是一個法國女孩。

我的一個解決方案是這樣的: 我的控制器:

public ActionResult Create() 
    {  
     ViewBag.formateurListe = (from unFormateur in db.salarie 
           where unFormateur.sFormateur == true 
           select unFormateur).AsEnumerable() 
.Select(m => new SelectListItem 
           { 
            Text = m.sNom.ToString() + " " + m.sPrenom.ToString(), 
            Value = m.sId.ToString() 
           }).ToList(); 

     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(formation formation, IEnumerable<SelectList> formateurList) 
    { 

     if (ModelState.IsValid) 
     { 
      db.formation.Add(formation); 

      foreach (var unSal in formateurList) 
      { 
       formateur f = new formateur(); 
       f.ftIdFormation = formation.fId; 
       f.ftIdSalarie = (int)unSal.SelectedValue; 
       db.formateur.Add(f); 

      } 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(formation); 
    } 

筆者認爲:

@model MvcAppGestionRH.Models.formation 
@using (Html.BeginForm("Create", "Formation", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 

      @Html.Label("Libelle")   
      @Html.EditorFor(model => model.fLibelle) 
      @Html.ValidationMessageFor(model => model.fLibelle) 

       <label id="fFormateur">Formateur</label>         

       @Html.ListBox("formateurListe", ViewData["formateurListe"] as SelectListItem[], new {Multiple = "multiple"}) 

       <input type="button" value="+" name="add" /> 
       <select name="select" size="7" > 
       </select>  
<input type="submit" value="Créer" />   
} 

隨着腳本:

$(function() { 
      $("#Add").click(function() { 
       $("select").add($('fFormateurListe').selected); 
      }); 
     }); 
+0

最好是,如果你能告訴我們你的代碼... –

回答

-1

您是否嘗試過使用viewmodel在視圖中傳遞你的兩個模型?

例如:

視圖模型

public class CreateFormationViewModel 
{ 
    public Formation formation{ get; set; } 
    public List<Formative> trainers {get;set;} 

} 

,然後使用這個視圖模型在你看來

一個簡單的方法來使用此視圖模式:

在你的控制器

public ActionResult CreateFormation() 
{ 
    //Get your data (formation and trainer) 
    CreateFormationViewModel createFormationVM = new CreateFormationViewModel(); 
    createFormationVM.formation = YourFormationModel; 
    createFormationVM.trainers = YourtrainersModelasList; 

    //bind data to the view 
    return View(createFormationVM); 
} 

而且在您看來,您有:

@model [yournamespace].CreateFormationViewModel 
+0

不,我不使用它並且我不知道如何使用......這是我在ASP中的第一個項目 –

+0

我已經獲得了更多信息,它實際上就像使用模型一樣,但通常使用一些東西將模型映射到像Automapper這樣的視圖模型。 – JDahm

+0

什麼是「YourFormationModel」和「YourtrainersModelasList」?我很抱歉,我的問題對於開發者來說可能是愚蠢的,但我真的迷失了。感謝您的回答 –

1

複選框可能會非常棘手的第一次 - 我用Google搜索,長期以來,太。

我的解決方案是一個視圖模型看起來像這樣:

其目的是爲問題,其中crator可以通過speciy複選框的項目(如一個問題可能會回答「好」與「壞」。

public class QuestionModel 
{ 
    public int QuestionID { get; set; } 

    public string QuestionText { get; set; } 

    /// <summary> 
    /// Gets or sets the selected items. Purely a helper List to display check boxes for the user 
    /// </summary> 
    /// <value> 
    /// The selected items. 
    /// </value> 
    [Display(Name = "Items", ResourceType = typeof(Domain.Resources.Question))] 
    public IEnumerable<SelectListItem> SelectedItems { get; set; } 

    /// <summary> 
    /// Gets or sets the selected ids. Populated by the user, when he checks/unchecks items. Later translated into QuestionItems 
    /// </summary> 
    /// <value> 
    /// The selected ids. 
    /// </value> 
    public int[] SelectedIds { get; set; } 
} 

該填充這樣的QuestionController:

private async Task GetSelectedItems(QuestionModel sm, Item selectedItems) 
    { 
     var alreadySelected = new List<Scale>(); 

     if (selectedScale != null) 
     { 
      alreadySelected.Add(selectedScale); 
     } 

     var itemList = (await this.uoW.ItemRepository.Get()).OrderBy(i => i.Name); 

     sm.SelectedItems = itemList.Select(x => new SelectListItem 
     { 
      Value = x.ScaleID.ToString(), 
      Text = x.NameOfScale.GetText(), 
      Selected = (from a in alreadySelected where a.ItemID == x.ItemID select x).Any() 
     }); 
    } 

這是什麼呢?它獲取數據庫中所有可擴展項目的列表,並使用它填充模型。此外,您可以傳入已經選擇的項目列表 - 因此您可以編輯現有的問題,並掃描所有已檢查的項目。

和n我用一個DropDownList的觀點:

<div class="form-group"> 
     @Html.LabelFor(model => model.SelectedItems, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <div class="checkbox"> 
       @Html.DropDownListFor(x => x.SelectedIds, Model.SelectedItems, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.SelectedItems, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    </div> 

如果你想複選框,看起來像這樣(不同的控制器,所以不要混淆)

for (int i = 0; i < Model.SelectedItems.Count(); i++) 
     { 
      var currentElem = Model.SelectedItems[i]; 
      //if this item is selected by the user, e.g. because he is editing the item, the item will be pre-selected 
      var selected = currentElem.Selected ? "checked=\"selected\"" : string.Empty; 

      // column for the questions. expected layout: list of all questions 
      <div class="col-md-6"> 
       <div class="checkbox" id="SelectedIds"> 
        <label> 
         <input type="checkbox" value="@currentElem.Value" @selected name="SelectedIds"> 
         @Html.Encode(currentElem.Text) 
        </label> 
       </div> 
      </div> 
     } 

終於創造()方法本身:

[HttpPost] 
      [ValidateAntiForgeryToken] 
      public async Task<ActionResult> Create([Bind(Include = "QuestionText,SelectedItems, SelectedIds")] QuestionModel question) 
      { 
       if (ModelState.IsValid) 
       { 
// I need only one Item, but if you want ore more change this line 
        if (question.SelectedIds.Count() == 1) 
        { 
// better use Automapper here, this is unnecessary work 
         var newQuestion = new Question { QuestionText = question.QuestionText}; 

         var ItemID = question.SelectedIds.First(); 

         newQuestion.QuestionScale = await this.uoW.ItemRepository.GetRaw().Where(i => i.ItemID == ItemD).FirstAsync(); 

         this.uoW.QuestionRepository.Insert(newQuestion); 

         await this.uoW.Save(); 

         return this.RedirectToAction("Index"); 
        } 
        else 
        { 
         this.logger.Warn("User {0} tried to insert more than one Itemin question {1}", User.Identity.Name, question.QuestionID); 
         ModelState.AddModelError(string.Empty, xyz.Areas.QuestionManagement.Resources.QuestionRes.ErrorTooManyScales); 
        } 
       } 
       else 
       { 
// the SelectedItems are empty in the model - so if you have to redisplay it, repopulate it. 
        await this.GetSelectedItems(question, null); 
       } 

       return this.View(question); 
      } 
+0

+1很好地解釋了...... –

+0

@KrishnrajRana謝謝 –