Передавать значение от одного контроллера к другому в ASP. NET Core 3.1 MVC - PullRequest
0 голосов
/ 12 июля 2020

Как я могу передать выбранное значение в раскрывающемся списке из моего представления в контроллер, а затем в другой контроллер? У меня есть домашняя страница и страница о нас. На домашней странице пользователь выбирает элемент из раскрывающегося списка, затем нажимает кнопку, которая перемещает его на другую страницу с таким же раскрывающимся списком. Моя цель - предварительно заполнить раскрывающийся список на странице about на основе того, что они выбрали на домашней странице.

Моя проблема в том, что я выполняю навигацию в моем контроллере домашней страницы, поэтому я не получаю значение выбранного значения, потому что это не просто сообщение. Моя переменная string countryDDL в моем домашнем контроллере имеет значение null.

В настоящее время я использую TempData для передачи значения, однако я открыт для других вариантов (viewbag, состояние сеанса и т. Д. c). Спасибо за ваше время.

Просмотр домашней страницы:

<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");
        }

Контроллер My Book Page:

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

            return View();
        }

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Во-первых, ваш код совершает ошибку, из-за которой вы не можете передать TempData["myData"] перенаправление другому действию контроллера со следующим сообщением об ошибке. Это потому, что TempData использует Session, который сам использует IDistributedCache. IDistributedCache не имеет возможности принимать объекты или сериализовать объекты:

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

Вот вся рабочая демонстрация:

Home / Index.cs html:

<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>
}

HomeController:

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.cs html:

<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>

AboutPageController:

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");
}
0 голосов
/ 12 июля 2020

1 - вы можете использовать форму для навигации и отправки с переходом на страницу about:

  <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: и выберите, как показано ниже: (установите событие «onChange»)

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