2017-02-28 17 views
0

ロードされているモデルから選択されたオプションを持つシンプルな選択があります。ここで起動するにはc#MVC 6 dotnet core select選択されていないオプションが選択されていない

は私の単純なモデル

public class invoice 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public invoice_state invoice_state { get; set; } 

} 


public class invoice_state 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string alias { get; set; } 

    public List<invoice> invoices { get; set; } 

    [Display(Name = "title")] 
    public string title { get; set; } 
} 

ここで1つのビューで動作する私が持っているものです。コントローラで

:ビューで

public IActionResult Create() 
    { 
     string state = "start_finish"; 
     ViewBag.State = state; 
     var states = _context.invoice_state.Select(c => new { 
      id = c.ID, 
      title = c.title 
     }).ToList(); 
     ViewBag.States = new SelectList(states, "id", "title", _context.invoice_state.Where(e => e.alias == state).FirstOrDefault().ID); 

     return View(); 
    } 

@Html.DropDownList("invoice_state", (SelectList)ViewBag.States, "--Select One--") 

正常に動作し、オプションが選択されている...しかし、私の編集上のほとんどの設定と同じされたビューが動作しません。コントローラで

public async Task<IActionResult> Edit(int? id) 
    { 
     var invoice = await _context.invoice 
      .Include(_item => _item.invoice_state).SingleOrDefaultAsync(m => m.ID == id); 
     if (invoice == null) 
     { 
      return NotFound(); 
     } 
     string state = "start_finish"; // as a default 
     var states = _context.invoice_state.Select(c => new { id = c.ID, title = c.title }).ToList(); 
     if (null != invoice.invoice_state) 
     { 
      ViewBag.State = invoice.invoice_state.alias; 
     } 
     else 
     { 
      ViewBag.State = state; 
     } 
     ViewBag.States = new SelectList(states, "id", "title", _context.invoice_state.Where(e => e.alias == state).FirstOrDefault()); 

     return View(invoice); 
    } 

と編集ビュー

@Html.DropDownList("invoice_state", (SelectList)ViewBag.States, "--Select One--") 

私はすべての場所で読んでいると、複数のファイルをアップ配線されていない単純な答えを見つけることができませんで、それらのものでさえ、私を必要性に導く助けにはなりませんでした。私もそれを強制しようとしているし、それは動作していませんが、それもここに配置する価値があると思った。

 ViewBag.States = _context 
          .invoice_state 
          .Select(c => new SelectListItem { 
           Value = c.ID.ToString(), 
           Text = c.title 
          }) 
          .Select(l => new SelectListItem { 
           Selected = (l.Value == invoice.invoice_state.ID.ToString()), 
           Text = l.Text, 
           Value = l.Value 
          }); 

だけ私は前のような選択に.ToList()を追加した場合'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>' to 'Microsoft.AspNetCore.Mvc.Rendering.SelectList'またはエラーのリストのバージョンを取得します。

一部の人

は、選択した値を設定することが示唆されている、と私はそれを読むと、それは私が

<select asp-for="invoice_state" asp-items="@ViewBag.States" > 
    <option>Please select one</option> 
</select> 

それはどちらか動作しません、参照を使用している場合

if (null != invoice.invoice_state) 
{ 
    ViewBag.invoice_stateID = invoice.invoice_state.ID; 
} 
else 
{ 
    ViewBag.invoice_stateID = _context.invoice_state.Where(e => e.alias == "start_finish").FirstOrDefault().ID; 
} 

、のようになりますリストは選択されていません。最後に、私がそれを選択して提出すると、データベースの値が設定されます。編集に戻ったときに、再び何かを再度選択することができません。

また

<dt> 
     @Html.DisplayNameFor(model => model.invoice_state) 
    </dt> 
    <dd> 
     @Html.DisplayFor(model => model.invoice_state) 
    </dd> 
+0

GETメソッドで 'invoice_state'プロパティの値を設定し、そのモデルをビューに渡す必要があります。あなたはそのコードを表示していません! (プロパティにバインドするときに 'SelectListItem'の' Selected'プロパティを設定するのは意味がありません) –

+0

編集で私はプロパティをリセットする必要がありますか?私はデータベースに設定された値を持っています。モデルにあり、 'invoice'モデルを呼び出したときに' invoice_state'がnullでないことを確認するために '.Include(_item => _item.invoice_state)'を設定しました。上記のとおりです。 –

+0

あなたは 'return view(yourmodel);'コードを表示していません。 'Invoice_state'は複雑なオブジェクトであり、複雑なオブジェクトにはバインドできません。バインドするには' int SelectedInvoice'というプロパティが必要です。 - '@Html.DropDownListFor(m => m.SelectedInvoice、(SelectList)ViewBag.States 、 " - 1つを選択する - ") ' - 常に強く型付けされたメソッドを使用します –

答えて

1

@Stephen Mueckeが右から来たデータ

enter image description here

がある明確にするために、チケットがViewModelにあります。完全にファンではありませんが、私は煮詰めます。解決策は表示するだけではなく、保存する必要もあります。ここにその全体があります。コントローラのアクションで

のViewModel

namespace project_name.Models.InvoiceViewModel 
{ 
    public class EditInvoiceViewModel 
    { 
     public int invoice_stateID { get; set; } 
     public invoice invoice { get; set; } 
     public List<SelectListItem> States { set; get; } 
    } 
} 

編集

public async Task<IActionResult> Edit(int? id) 
    { 


     var invoice = await _context.invoice 
      .Include(_item => _item.invoice_state).SingleOrDefaultAsync(m => m.ID == id); 

     string state = "start_finish"; // as a default 
     var states = _context.invoice_state.Select(c => new { id = c.ID, title = c.title }).ToList(); 
     if (null != invoice.invoice_state) 
     { 
      ViewBag.State = invoice.invoice_state.alias; 
     } 
     else 
     { 
      ViewBag.State = state; 
     } 

     var vm = new EditInvoiceViewModel(); 
     vm.invoice = invoice; 
     vm.States = _context 
          .invoice_state 
          .Select(c => new SelectListItem 
          { 
           Value = c.ID.ToString(), 
           Text = c.title 
          }) 
          .ToList(); 

     if (null != invoice.invoice_state) 
     { 
      vm.invoice_stateID = invoice.invoice_state.ID; 
     } else { 
      vm.invoice_stateID = _context.invoice_state.Where(e => e.alias == "start_finish").FirstOrDefault().ID; 
     } 
     return View(vm); 
    } 

コントローラのアクションに保存する

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Edit(EditInvoiceViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       model.invoice.creator = await GetCurrentUserAsync(); 
       model.invoice.invoice_state = await _context.invoice_state.SingleOrDefaultAsync(m => m.ID == model.invoice_stateID); 
       _context.Update(model.invoice); 
       await _context.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!invoiceExists(model.invoice.ID)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

そして

<div class="form-group"> 
     <label asp-for="@Model.invoice_stateID" class="col-md-2 control-label"></label> 
     <select asp-for="@Model.invoice_stateID" asp-items="@Model.States" > 
      <option>Please select one</option> 
     </select> 
    </div> 

ビューで、私は私が苦労したと思います物が全てこのようなものです質問を支援している、そしてすべてのブログは、ディスプレイに焦点を当て、私はまだそれを保存する必要がありますそれは明らかではありませんでした。私は[bind()]をスキップしなければならなかったが、私はそれに戻ってくるだろう。

関連する問題