如何将两个动作合并到一个控制器中

How to merge two actions into one Controller

我想为报告创建一个应用程序,但由于出现这些错误而陷入困境,我不知道该怎么做。 所以我将尝试解释我想要的:一个视图有两个 dropdown lists,这是两个不同的 Models。所以一个 dropdown 使用 Model 1 而另一个 dropdown 使用 Model 2。 我为这两个下拉菜单创建了两个不同的操作

public interface IDemIzvjestaji
    {                
        public List<DvojkaVM> VratiTipove();

        public List<DvojkaVM> VratiDefinicije();
    }

并在我的 Service

中实现这些方法
using IZ.BLL.Interfejsi;
using IZ.Model.DBModels;
using IZ.Model.VM;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using Formatting = Newtonsoft.Json.Formatting;

namespace IZ.BLL.Servisi
{
    public class DemIzvjestajiServis : IDemIzvjestaji
    {
        private AppDBContext _context;
        public DemIzvjestajiServis(AppDBContext context)
        {
            _context = context;
        }

        public bool DemirMetodaDemo()
        {
            return true;
        }

        public List<DvojkaVM> VratiDefinicije()
        {
            var def = _context.IzvjestajDefinicija.ToList();
            if (def.Count == 0)
                return null;
            var defVM = new List<DvojkaVM>();
            foreach(var item in def)
            {
                var izvDef = new DvojkaVM();
                izvDef.text1 = item.IzvjestajDefinicijaId.ToString();
                izvDef.text2 = item.KratkiNaziv;
                defVM.Add(izvDef);
            }
            return defVM;
        }

        public List<DvojkaVM> VratiTipove()
        {
            var lista = _context.IzvjestajTip.ToList();
            if (lista.Count == 0)
                return null;
            var listaVM = new List<DvojkaVM>();
            foreach(var i in lista)
            {
                var tipVM = new DvojkaVM();
                tipVM.text1 = i.IzvjestajTipId.ToString();
                tipVM.text2 = i.Naziv;
                listaVM.Add(tipVM);
            }
            return listaVM;
        }
    }
}

And In my Controller I created Action and use ViewBag to send data to View


     public IActionResult TipIzvjestaja()
            {
                ViewBag.SelektTip = _demIzvjestajiServis.VratiTipove();
                return View("Index");
            }

            public IActionResult IzvjestajDefinicija()
            {
                ViewBag.SelektDef = _demIzvjestajiServis.VratiDefinicije();
                return View("Index");


}

我在视图中显示了两个下拉列表。

<div>
    <p>Odaberi Tip izvještaja:</p>
    <select asp-items="@(new SelectList(ViewBag.SelektTip,"text1","text2"))" class="row form-control col-4">
        <option value="0">Odaberite</option>
    </select>
</div>

<div>
    <p>Odaberi Definiciju Izvjestaja:</p>
    <select asp-items="@(new SelectList(ViewBag.SelektDef ,"text1","text2"))" class="row form-control col-4">
        <option value="0">Odaberite</option>
    </select>
</div>

在我 运行 之后我得到错误

ArgumentNullException: Value cannot be null. (Parameter 'items')
<select asp-items="@(new SelectList(ViewBag.SelektDef ,"text1","text2"))" class="row form-control col-4">

我在拆分这两个操作时修复了这个错误,并创建了另一个视图并放置了下拉列表,但我希望这些在一个视图中有两个 dropdown 列表。 如果有人能帮助我,我将不胜感激

如果您要通过 HTTP 进行两次调用,您只需要执行两次操作,在您的情况下,您不需要执行两次操作。

你可以让它像这样工作:

        public IActionResult TipIzvjestaja()
        {
            ViewBag.SelektTip = _demIzvjestajiServis.VratiTipove();
            ViewBag.SelektDef = _demIzvjestajiServis.VratiDefinicije();
            return View("Index");
        }

这样您就可以为您的视图提供它期望的两个列表。