【问题标题】:c# MVC 6 dotnet core select with selected option not selectingc#MVC 6 dotnet core select with selected option not selection
【发布时间】: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&lt;Microsoft.AspNetCore.Mvc.Rendering.SelectListItem&gt;' 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 的值并将模型传递给视图 - 您还没有显示该代码! (并且在绑定到属性时设置SelectListItemSelected 属性是没有意义的)
  • 抱歉在编辑中我需要重置属性?我在数据库中设置了值,它在模型中,只是为了确保invoice_state 在我调用invoice 模型时不为空,我设置了.Include(_item =&gt; _item.invoice_state),如上所示。
  • 您甚至没有显示return view(yourmodel); 代码。而invoice_state 是一个复杂对象,你不能绑定到一个复杂对象——你需要一个int SelectedInvoice 的属性来绑定——@Html.DropDownListFor(m =&gt; m.SelectedInvoice, (SelectList)ViewBag.States, "--Select One--")——并且总是使用强类型方法
  • 我现在展示了整个编辑方法和返回。数据在那里,我可以得到它。如果我输入int SelectedInvoice 是不是会尝试将其添加到数据库中?当它已经存在时,必须告诉它它有一个选定的值,这似乎是超级多余的。哈哈,此刻我只想让它工作:D
  • 您正在编辑数据 - 第 1 步。始终使用视图模型 - What is ViewModel in MVC?。并建议您研究代码here(但您可以使用@Html.DropDownListFor(m =&gt; m.invoice_state.ID, (SelectList)ViewBag.States, "--Select One--"),假设这是您要绑定的属性)

标签: c# asp.net-mvc entity-framework asp.net-core-mvc


【解决方案1】:

@Stephen Muecke 是对的,票是 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()],但我会回到那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多