Member 13716754 Ответов: 2

Передайте данные с одного контроллера на домашний контроллер с помощью класса модели и просмотрите выходные данные на домашней странице.


У меня есть класс RestCallcontroller. Я хочу передать данные из Restcontroller в Home Controller. Это theRestController
public class RestCallController : Controller
{
    public  string loginJsonString;
    Result result = new Result();

    // GET: RestCall
    public async Task<ActionResult> RunAsync(string a, string b)
    {

        using (var handler = new HttpClientHandler { UseDefaultCredentials = true })
        using (var client = new HttpClient(handler))
        {

            var byteArray = Encoding.ASCII.GetBytes("username:password");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
            client.BaseAddress = new Uri("XXX");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = await client.GetAsync("XXX");

            if (response.IsSuccessStatusCode)
            {
                //Get the response
                 loginJsonString = await response.Content.ReadAsStringAsync();
                result.loginJsonStringop = loginJsonString;
                //Json deserialization
                VehicleResponse vehicleobj = JsonConvert.DeserializeObject<VehicleResponse>(loginJsonString);
                List<string> modelList = new List<string>();
                List<string> descriptionList = new List<string>();

                foreach (Vehicle veh in vehicleobj.Vehicles)
                {
                    var model = veh.Model;
                    var Description = veh.Description;
                    modelList.Add(model);
                    var modellist = modelList;
                    descriptionList.Add(Description);
                }
            }
        }
        return RedirectToAction("Index", "HomeController",new { resultop =result });
    }
}

Ниже идет мой домашний контролер.
public class HomeController : Controller
{
    string a;
    string b;

    // GET: Home
    public ActionResult Index(Result resultop)
    {
        RestCallController restcallController = new RestCallController();
        restcallController.RunAsync(a,b);
        resultop.loginJsonStringop = restcallController.loginJsonString;
        return View(resultop);
    }
}

Это мой класс моделей.
public class Result
    {
        public string loginJsonStringop { get; set; }
        public string modelop { get; set; }
        public string descriptionop { get; set; }
    }

Индексированное представление.
using IFS_Integration_MVC.Models
@model IFS_Integration_MVC.Models.Result

@{
    ViewBag.Title = "Index";
}

<!DOCTYPE html>
<html>
<head>
    <title>Rest Call</title>
</head>
<body>
    <h2>Index</h2>
    <div><h2>@Model.loginJsonStringop</h2></div>
</body>
</html>

Я хочу передать значение loginJsonString, modelList,descriptionList методу index() в домашнем контроллере и просмотреть его в индексном представлении.

Что я уже пробовал:

Я создал контроллеры и класс модели, как описано выше. Но все равно не может получить ценности.

F-ES Sitecore

Не очень понятно, что вы пытаетесь сделать, но контроллеры должны использоваться только для обработки запросов, вы не создаете один контроллер из другого и не запускаете его методы. Если вы хотите передавать данные между контроллерами то в первом контроллере храните данные которые вы хотите передать в TempData

http://www.tutorialsteacher.com/mvc/tempdata-in-asp.net-mvc

затем верните RedirectToAction, чтобы перенаправить клиента на предполагаемое действие вашего предполагаемого контроллера, и в этом втором контроллере получите данные из TempData.

2 Ответов

Рейтинг:
9

Richard Deeming

Цитата:
public async Task<ActionResult> RunAsync(string a, string b)
...
restcallController.RunAsync(a,b);
resultop.loginJsonStringop = restcallController.loginJsonString;

Один async метод возвращается, как только он попадает в первый await вызов. Метод не закончился до тех пор, пока не вернулся Task завершилось.

Поскольку вы не ждете завершения задачи, то loginJsonString поле не будет установлено.

Вам нужно await возвращенная задача перед попыткой доступа к loginJsonString поле.
public async Task<ActionResult> Index(Result resultop)
{
    RestCallController restcallController = new RestCallController();
    await restcallController.RunAsync(a,b);
    resultop.loginJsonStringop = restcallController.loginJsonString;
    return View(resultop);
}


Рейтинг:
2

#realJSOP

Если я правильно помню, я использовал метод, описанный по этой ссылке, чтобы сохранить данные между запросами (сайт заблокирован на работе, но URL-адрес кажется знакомым):

Получение информации в макет без использования ViewBag. – логово кодирования джгауффина[^]