【发布时间】:2017-02-28 07:59:07
【问题描述】:
我有一个简单的选择,其中包含从加载的模型中选择的选项。
从这里开始是我的简单模型
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
});
但如果我像以前一样在选择上添加.ToList(),则只能获得'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>' to 'Microsoft.AspNetCore.Mvc.Rendering.SelectList' 或错误的列表版本。
有些人建议设置选定的值,当我阅读它时,它会是这样的,
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_state在我调用invoice模型时不为空,我设置了.Include(_item => _item.invoice_state),如上所示。 -
您甚至没有显示
return view(yourmodel);代码。而invoice_state是一个复杂对象,你不能绑定到一个复杂对象——你需要一个int SelectedInvoice的属性来绑定——@Html.DropDownListFor(m => m.SelectedInvoice, (SelectList)ViewBag.States, "--Select One--")——并且总是使用强类型方法 -
我现在展示了整个编辑方法和返回。数据在那里,我可以得到它。如果我输入
int SelectedInvoice是不是会尝试将其添加到数据库中?当它已经存在时,必须告诉它它有一个选定的值,这似乎是超级多余的。哈哈,此刻我只想让它工作:D -
您正在编辑数据 - 第 1 步。始终使用视图模型 - What is ViewModel in MVC?。并建议您研究代码here(但您可以使用
@Html.DropDownListFor(m => m.invoice_state.ID, (SelectList)ViewBag.States, "--Select One--"),假设这是您要绑定的属性)
标签: c# asp.net-mvc entity-framework asp.net-core-mvc