2017-08-11 106 views
2

我對ASP.Net MVC相當新,所以原諒我的任何應該是顯而易見的。Asp.net MVC多個選擇列表屬性

我有一個對象,其中包含屬性是一個列表。我只是不知道該如何在創建中實現這一點。 這是對象:

public class TeamMember 
{ 
    public int TeamMemberId { get; set; } 
    public string FristName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDate { get; set; } 
    public string Biographie { get; set; } 
    public virtual Image Image { get; set; } 
    public virtual List<DanGrade> DanGrades { get; set; } 
} 

在創建視圖我希望能夠選擇多個Dangrades。

我試圖修改編輯模板它看起來像這樣:

@using BudoschoolTonNeuhaus.Models 
@model BudoschoolTonNeuhaus.Models.TeamMember 

@{ 
    var db = new ApplicationDbContext(); 
    var danGrades = db.DanGrades.ToList(); 
} 

<select multiple name="@ViewData.TemplateInfo.HtmlFieldPrefix" class="dropdown"> 
    @foreach (var dan in danGrades) 
    { 
     <option value="@"> 
      @dan.DanGradeId: @dan.BudoSport, @dan.Grade 
     </option> 
    } 
</select> 

,但是這並沒有給,我認爲它會,它只是顯示在創建視圖多發dangrade標籤的結果是你可以在這裏看到:

@model BudoschoolTonNeuhaus.Models.TeamMember 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Admin_Layout.cshtml"; 
} 
<div class="wrapper"> 
    <h2>Create</h2> 

    @using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken() 

     <div class="form-horizontal"> 
      <h4>TeamMember</h4> 
      <hr /> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      <div class="form-group"> 
       @Html.LabelFor(model => model.FristName, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(model => model.FristName, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(model => model.FristName, "", new { @class = "text-danger" }) 
       </div> 
      </div> 

      .... // controls for other properties of model 

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

      <div class="form-group"> 
       @Html.LabelFor(model => model.Image, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        <input type="file" id="Image" name="Image" hidden /> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="col-md-offset-2 col-md-10"> 
        <input type="submit" value="Create" class="btn btn-default" /> 
       </div> 
      </div> 
     </div> 
    } 

    <div> 
     @Html.ActionLink("Back to List", "Index") 
    </div> 
</div> 

當前HTML輸出:

Current output (not what i want)

感謝您提前幫忙!

+0

? 「多少dangrade標籤」是什麼意思? – Wndrr

+2

另外,最佳做法是您不應該在視圖中進行任何數據庫調用。這應該是在控制器或在一個專門的類 – Wndrr

+0

@Wndrr oke謝謝你的提示!:)我編輯帖子到當前輸出是什麼 – Diceble

回答

1

要創建一個<select multiple>使用ListBoxFor()方法在您的視圖。

但是您的模型需要兩個屬性,以生成一個列表框,一個IEnumerable<int>結合所選擇的值(假定的DanGrade的ID媒體資源相關聯是的typeof int)和IEnumerable<SelectListItem>顯示<option>元件。

您編輯的數據,所以總是先從視圖模型

public class TeamMemberVM 
{ 
    public int? TeamMemberId { get; set; } 
    .... 
    [Display(Name = "DanGrades")] 
    public IEnumerable<int> SelectedDanGrades { get; set; } 
    public IEnumerable<SelectListItem> DanGradesList { get; set; } 
} 

,你的看法會

@model yourAssembly.TeamMemberVM 
.... 
@Html.ListBoxFor(m => m.SelectedDanGrades, Model.DanGradesList, new { @class="dropdown" }) 

和你的控制器方法將

public ActionResult Create() 
{ 
    TeamMemberVM model = new TeamMemberVM(); 
    ConfigureViewModel(model); 
    // For an Edit method, your would set the existing selected items here 
    model.SelectedDanGrades = ... 
    return View(model); 
} 
public ActionResult Create(TeamMemberVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ConfigureViewModel(model); // repopulate the SelectList 
     return View(model); 
    } 
    // model.SelectedDanGrades contains the ID's of the selected options 
    // Initialize an instance of your data model, set its properties based on the view model 
    // Save and redirect 
} 
private void ConfigureViewModel(TeamMemberVM model) 
{ 
    IEnumerable<DanGrade> danGrades = db.DanGrades(); 
    model.DanGradesList = danGrades.Select(x => new SelectListItem 
    { 
     Value = x.DanGradeId.ToString(), 
     Text = x.??? // the name of the property you want to use for the display text 
    }); 
} 

還要注意你的視圖有一個文件輸入,所以你的視圖模型需要一個HttpPostedFileBase屬性來綁定該文件以

public HttpPostedFileBase Image { get; set; } 

和你能告訴我們輸出HTML視圖

@Html.TextBoxFor(m => m.Image, { new type ="file" }) 
+0

你真的很滿意你的答案!非常感謝你的努力:) – Diceble

0

所以你正試圖保存對象內的自定義對象列表。首先,知道如果您嘗試將團隊成員保存到數據庫中,則不會保存對象列表。我遇到過這個相同的問題,它需要一些特殊的配置才能正常工作。

其次,您不能從< select>中選擇自定義對象。選擇返回字符串[]到您的控制器。所以對象,不。您無法直接使用select返回像這樣的複雜項目。

你可以做的是返回一個字符串[]並使用單個字符串(也許它包含名稱,可能它包含id?),然後使用該數組將每個對象從控制器中的dangrade數據庫上下文(我假設這是他們存儲的地方)。

因此,例如,如果你回到你的控制器並添加(string [] dangrades)到你的參數。你的參數現在看起來像這樣(string [] dangrades,Bind [blahblah] ... teammember)。

現在引用如果先前已存儲dangrades其他格式(即不是一個數據庫),你可以做如下

teammember.Dangrades = new list<Dangrade>(); 
    foreach(string item in dangrades) 
    { 
    var dangradeselected = from x in db.dangrades where x.name = item select x;  
    var dangradefromlinq = dangradeselected.tolist(); 
    teammember.Dangrades.Add(dangradefromlinq[0]); 
    } 

其他數據庫後,那麼你將不得不追加你的代碼,或明確要求與此爲更好的答案。

另外不要忘記給你的選擇和id =(查找html屬性),以便控制器可以識別它。

你或許可以使這個(僞)代碼稍微整齊。另外不要忘記可能的空值。

如果你想保存每個teamember的項目列表,你也可以看看有2個數據庫。我不確定這是否被推薦。但是你可以爲團隊成員設立一個,而一個爲dangrades。在dangrades的情況下,您可以添加一個名爲grouping id的附加屬性,它將與您的團隊成員的id相匹配。所以當你拉起你的團隊成員時,你也可以拉出與其數據庫ID相匹配的所有相關數據。

這就是我能想到的一切。如果你找到一個更簡單的解決方案,盡一切辦法。

+0

如果你考慮答案權利,請接受它。 –

0

你的模型不應該那樣嗎?

[UIHint("NameOfTheEditorTemplate")] 
public virtual List<DanGrade> DanGrades { get; set; } 

務必把EditorTemplate這兩條路徑之一下

~/Views/Shared/EditorTemplates 
~/Views/Controller_Name/EditorTemplates 

正如所解釋的in this post