我有一個簡單的選擇與從加載的模型中選擇一個選項。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>
它也不管用,看列表但沒有選擇。最後要注意的是,如果我選擇它並提交它,它會在數據庫中設置值,只是當我回到編輯時它再次無法再選擇任何東西。
而且要明確有數據
這些來自
<dt>
@Html.DisplayNameFor(model => model.invoice_state)
</dt>
<dd>
@Html.DisplayFor(model => model.invoice_state)
</dd>
您需要在GET方法中設置屬性'invoice_state'的值並將模型傳遞給視圖 - 您沒有顯示該代碼! (並且在綁定到一個屬性時設置'SelectListItem'的'Selected'屬性是毫無意義的) –
對不起,在編輯我需要重置屬性?我有在數據庫中設置的值,它在模型中,只是爲了確保當我調用我設置的'invoice'模型時,invoice_state'不爲空'.Include(_item => _item.invoice_state)'which如上所示。 –
你甚至沒有顯示'return view(yourmodel);'代碼。 'invoice_state'是一個複雜的對象,你不能綁定到一個複雜的對象 - 你需要一個'int SelectedInvoice'屬性來綁定到'@ Html.DropDownListFor(m => m.SelectedInvoice,(SelectList)ViewBag.States ,「--Select One - 」)' - 總是使用強類型方法 –