2017-08-11 17 views
2

私はASP.Net MVCにはかなり新しいので、明らかにすべきことは何でも許してください。Asp.net ListプロパティのMVC多重選択

私は、リストであるプロパティを含むオブジェクトを持っています。私はどのように私は作成でこれを実装する必要があります知りません。私は複数のDangradesを選択することができるようにしたい作成ビューで

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

: これはオブジェクトです。

私はこのようになり、それ用のエディタテンプレートの変更を行おうとしました:

@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

にファイルあなたは私たちに出力HTMLを表示することができますか?あなたは "複数のダングラーデのラベル"とはどういう意味ですか? – Wndrr

+2

また、ビューでデータベース呼び出しを行ってはいけないというのが良い方法です。これはコントローラまたは専用のクラスにあるはずです – Wndrr

+0

@Wndrrヒントありがとう!:)現在の出力が – Diceble

答えて

1

を説明しました。

しかし、あなたのモデルは<option>要素を表示する(DanGradeのID proeprtyがint typeof演算であると想定)に選択された値をバインドするリストボックス、IEnumerable<int>を生成するための2つのプロパティを必要とし、IEnumerable<SelectListItem>

あなたはそう常にビューモデル

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.TextBoxFor(m => m.Image, { new type ="file" }) 
+0

あなたは本当にあなたの答えにスポットを当てていました!努力をいただきありがとうございます:) – Diceble

0

オブジェクト内にカスタムオブジェクトのリストを保存しようとしています。まず、チームメンバーをデータベースに保存しようとすると、オブジェクトのリストは保存されません。私はこの同じ問題を経験しました。

第2に、<選択>からカスタムオブジェクトを選択することはできません。 Selectはあなたのコントローラにstring []を返します。だからオブジェクト、いいえ。そのような複雑な項目は、selectを使って直接返すことはできません。

あなたができることは文字列[]を返し、個々の文字列を使用することです(多分それはidを含んでいるかもしれません)、そしてその配列を使って各オブジェクトをコントローラのteammemberオブジェクトに引っ張って渡しますdb文脈(私はそれがどこに格納されていると仮定しています)。

たとえば、コントローラに戻って(文字列[]ダングラッド)をパラメータに追加するとします。あなたのパラメータは次のようになりました(文字列[]ダングラデス、バインド[blahblah] ...チームメンバー)。

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

を次のようにあなたが以前に(つまり、データベースではなく)他のいくつかの形式でdangradesを格納していた場合、あなたが行うことができ、他のデータベースを参照した後、あなたはあなたのコードを追加する必要があります、または特別頼みますより良い答えのためにそれと一緒に。

また、コントローラが認識できるように、selectおよびid =(lookup html属性)を与えることを忘れないでください。

おそらく、この(擬似)コードをもう少し細かくすることができます。 null値の可能性も忘れないでください。

各チームメンバーのアイテムのリストを保存する場合は、2つのデータベースがあるかどうかを調べることもできます。これが推奨されているかどうかはわかりません。しかし、あなたはチームメンバーのために1つを持ち、ダングラードのために1つを持つことができます。ダングラドの場合は、あなたのチームメンバーのIDと一致するグループ化IDと呼ばれるプロパティを追加します。だからあなたがあなたのチームメンバーを引き上げるときに、データベースIDと一致するすべての関連するdawngradesをプルアップすることもできます。

それは私が考えることができるすべてです。是非簡単な解決策を見つけたら、それに付いてください。

+0

の投稿を編集しました。 –

0

あなたのモデルはそうであってはなりませんか?

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

は、これら2つのパスの1

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

下EditorTemplateを置くようにしてくださいとしては、あなたのビューでListBoxFor()メソッドを使用<select multiple>を作成するにはin this post