2017-02-28 47 views
0

我有一個簡單的選擇與從加載的模型中選擇一個選項。c#MVC 6 dotnet核心選擇與選定的選項不選擇

首先這裏是我的簡單模型

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

這裏是我有一個觀點的作品。

在控制器

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

,但只得到'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>' to 'Microsoft.AspNetCore.Mvc.Rendering.SelectList'或錯誤的列表版本,如果我在選擇像以前一樣添加.ToList()

有人建議設置選擇的值,和我讀它,它會是什麼樣子,

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

如果我使用

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

它也不管用,看列表但沒有選擇。最後要注意的是,如果我選擇它並提交它,它會在數據庫中設置值,只是當我回到編輯時它再次無法再選擇任何東西。

而且要明確有數據

enter image description here

這些來自

<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'不爲空'.Include(_item => _item.invoice_state)'which如上所示。 –

+0

你甚至沒有顯示'return view(yourmodel);'代碼。 'invoice_state'是一個複雜的對象,你不能綁定到一個複雜的對象 - 你需要一個'int SelectedInvoice'屬性來綁定到'@ Html.DropDownListFor(m => m.SelectedInvoice,(SelectList)ViewBag.States ,「--Select One - 」)' - 總是使用強類型方法 –

回答

1

@Stephen Muecke是正確的,車票視圖模型。這裏不是一個粉絲,但我會煨。解決方案不僅僅是讓它顯示,你也需要保存。這是它的全部。

視圖模型

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()],但我會回到那個。