在 ASP.NET Core MVC 中将值从一个控制器传递到另一个控制器

Pass value from one controller to another in ASP.NET Core MVC

如何将我的视图中的下拉选择值传递给控制器​​,然后再传递给不同的控制器?我有一个主页和一个关于页面。在主页上,用户从下拉列表中选择一个项目,然后他们单击一个按钮,将他们导航到具有相同下拉列表的另一个页面。我的目标是根据他们在主页上选择的内容在关于页面上预填充下拉菜单。

我的问题是我在我的主页控制器中进行导航,所以我没有得到所选值的值,因为它不是 post 只是一个获取。我的家庭控制器中的变量“string countryDDL”为空。

我目前正在使用 TempData 传递值,但是,我对其他选项(viewbag、会话状态等)持开放态度。谢谢你的时间。

首页浏览量:

<form method="post" asp-controller="Home" asp-action="Index" role="form">

    <div class="form-group">
        <label>Country Dropdown:</label>
        <select name="countryDDL" asp-items="@(new SelectList(ViewBag.message, "ID", "CountryName"))"></select>
    </div>
</form>
<a asp-action="AboutPage" asp-controller="Home">About Page</a>

家庭控制器:

        public void CountryDDL()
        {
            List<CountryModel> countryName = new List<CountryModel>();
            countryName = (from b in _context.CountryModel select b).ToList();
            countryName.Insert(0, new CountryModel { ID = 0, CountryName = "" });
            ViewBag.message = countryName;
        }

        [HttpGet("[action]")]
        public IActionResult AboutPage()
        {
            string countryDDL = HttpContext.Request.Form["countryDDL"];
            int intCountry = Convert.ToInt32(countryDDL);
            CountryModel data = new CountryModel()
            {
                ID = intCountry,
                CountryName = "",
            };
            TempData["myData"] = data;
            return RedirectToAction("Index", "AboutPage");
        }

我的书页控制器:

        [HttpGet("[action]")]
        [Route("/Index")]
        public async Task<IActionResult> Index()
        {
            //get values from Home controller
            CountryModel data = TempData["myData"] as CountryModel;

            return View();
        }

1-您可以使用表单导航并提交到关于页面:

  <form method="get" asp-controller="Home" asp-action="AboutPage" role="form">
        <div class="form-group">
            <label>Country Dropdown:</label>
            <select name="countryDDL" asp-items="@(new SelectList(ViewBag.message, "ID", "CountryName"))"></select>
        </div>
       <button type="submit">About Page</button>
    </form>

2-您可以像下面这样使用 jquery:

a:像这样更改标签:

<a href="" id="a_about">About Page</a>

b: 和 select 如下所示:(设置“onChange”事件)

 <select onchange="$('#a_about').prop('href','/Home/AboutPage?countryDDL='+$(this).val())" name="countryDDL" asp-items="@(new SelectList(ViewBag.message, "ID", "CountryName"))" ></select>

首先,您的代码犯了一个错误,您无法将 TempData["myData"] 重定向到另一个控制器操作,并出现以下错误 message.That 是因为 TempData 使用 Session,它本身使用 IDistributedCacheIDistributedCache 没有接受对象或序列化对象的能力:

InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type

这是整个工作演示:

Home/Index.cshtml:

<form method="post" asp-controller="Home" asp-action="Index" role="form">

    <div class="form-group">
        <label>Country Dropdown:</label>
        <select id="sel" name="countryDDL" asp-items="@(new SelectList(ViewBag.message, "ID", "CountryName"))"></select>
    </div>
</form>
<a asp-action="AboutPage" asp-controller="Home" >About Page</a>

@section Scripts{ 
<script>   
    $("a").click(function () {
        var selectItem = $('#sel').find(":selected").val();
        var href = $(this).attr('href');
        if (href) {
            href +="?countryDDL="+selectItem;
            $(this).attr('href', href);
            console.log(href);
        }
    });

</script>
}

家庭控制器:

public class HomeController : Controller
{
    private readonly MvcProj3_1Context _context;
    public HomeController(MvcProj3_1Context context)
    {
        _context = context;
    }
    public IActionResult Index()
    {
        CountryDDL();
        return View();
    }
    public void CountryDDL()
    {
        List<CountryModel> countryName = new List<CountryModel>();
        countryName = (from b in _context.CountryModel select b).ToList();
        countryName.Insert(0, new CountryModel { ID = 0, CountryName = "" });
        ViewBag.message = countryName;
    }
    [HttpGet]
    public IActionResult AboutPage(string countryDDL)
    {
        int intCountry = Convert.ToInt32(countryDDL);
        List<CountryModel> data = new List<CountryModel>()
       {
            new CountryModel()
            {
                ID = intCountry,
                CountryName = "asd",
            }
       };
        TempData["myData"] = JsonSerializer.Serialize(data);
        return RedirectToAction("Index", "AboutPage");
    }
}

AboutPage/Index.cshtml:

<form>
    <div class="form-group">
        <label>Country Dropdown:</label>
        <select id="sel" name="countryDDL" asp-items="@(new SelectList(ViewBag.message, "ID", "CountryName"))"></select>
    </div>
</form>

关于页面控制器:

public class AboutPageController : Controller
{
    [HttpGet]
    public async Task<IActionResult> Index()
    {
        //get values from Home controller
        ViewBag.message = JsonSerializer.Deserialize<List<CountryModel>>(TempData["myData"] as string);
        return View();
    }
}

结果:

更新

您可以获得如下数据:

[HttpGet]
public IActionResult AboutPage(string countryDDL)
{
    int intCountry = Convert.ToInt32(countryDDL);
      
    //change this line...
    var data = _context.CountryModel.Where(c => c.ID == intCountry).ToList();
    TempData["myData"] = JsonSerializer.Serialize(data);

    return RedirectToAction("Index", "AboutPage");
}