. NET Core (3.0) MVC - Как перенаправить на другой вид / .cs html страницы? - PullRequest
0 голосов
/ 02 февраля 2020
  1. У меня есть представление под названием Wx JS .cs html. Я использую JavaScript, чтобы получить JSON данных. Данные JSON отправляются на контроллер Wx
  2. Контроллер Wx обрабатывает данные JSON и, используя Twilio, я получаю текстовое сообщение, которое ясно указывает на то, что код работает в этом контроллере.

Вопрос / вопрос, который у меня есть, пожалуйста, как мне заставить контроллер Wx перенаправить из представления Wx JS .cs html Razor в представление Wx.cs html Razor для представления эти данные?

Я установил точку останова на странице Wx.chstml - управление программой опускается до этой точки останова - насколько я могу судить, это последняя точка останова, которая будет нажата. Тем не менее, страница Wx.chstml не загружается, браузер продолжает отображать страницу Wx JS .cs html.

Я что-то упустил (вероятно, очевидно), так как я работал над найти решение для этого часами :-(

Заранее спасибо !! :-) Wx JS Razor View

    <!doctype html>
<title>Example</title>

<script>
    var xhr = new XMLHttpRequest();
    var url = "https://cors-anywhere.herokuapp.com/https://www.511virginia.org/data/geojson/icons.rwis.geojson";


    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            var jsonData = JSON.parse(xhr.responseText);
            showWeather(jsonData);
        }
    };
    xhr.open("GET", url, true);
    xhr.send();

    function showWeather(data) {
        var output = "<ul>";
        var i;
        for (var i in data.features) {
           output += "<li>" + data.features[i].id  + "</li>";
        }
        output += "</ul>";
        document.getElementById("wxList").innerHTML = output;



        $.ajax({
            url: '/Home/Wx/',
            data: JSON.stringify(data),
            type: 'POST',
            traditional: true,
            contentType: 'application/json',
            success: function (data) {
                $('#message').html("Success!");
            }
        });




    }</script>


<div id="wxList"></div>

** Home WX Controller **

     [HttpPost]
        public IActionResult Wx([FromBody] RootObject data)
        {


            System.Net.WebClient client = new System.Net.WebClient();

            List<ConcerningWeatherData> WxStatDataList = new List<ConcerningWeatherData>();



            RootObjectItteration ObjItteratrion = new RootObjectItteration();
            WxStatDataList = ObjItteratrion.ItterateThroughRootObjectSettingValues(data, WxStatDataList);
            List<ConcerningWeatherData> SortedList = new List<ConcerningWeatherData>();
            try
            {
                SortedList = WxStatDataList.OrderBy(o => o.indexId).ToList();
                ViewBag.WxStatDataList = SortedList;

            }
            catch (Exception ex)
            { ex.ToString(); }




            try
            {
                TwilioSendText SendText = new TwilioSendText();
                string sendToUser = SendText.ParseThroughWhatWxToSendUser(SortedList);

                TwilioSendText numbers = new TwilioSendText();
                List<String> listOfPhoneNumbers = new List<String>();
                listOfPhoneNumbers = numbers.listOfPhoneNumbersToSendTo(listOfPhoneNumbers);

                // TURN TWILIO SEND TEXT ON OR OFF HERE:
                SendText.sendTextMessages(sendToUser, listOfPhoneNumbers);
            }
            catch (Exception ex)
            { ex.ToString(); }


            //return View();
            return View("Wx", "Home");


            //return View();
            // return Redirect("https://localhost:5001/Home/Wx.cshtml");



        }

И представление, которое я пытаюсь заставить контроллер направить на Wx.cs html (у меня есть идентичная страница Weather.cs html и когда я использую. NET Ядро для заполнения JSON it отображает эту страницу Weather.cs html) Опять же, Twilio отправляет мне текст со всеми данными, поэтому я знаю, что синтаксический анализ JSON работает.

    @{
    ViewData["Title"] = "C-Ville West";@*Privacy Policywas Privacy.cshtml*@
}
@*<h1>@ViewData["Title"]</h1>*@

<p></p>
@* loop over viewbag object *@
@foreach (var x in ViewBag.WxStatDataList)

{
    // wx station name & description
    <b>@x.description @x.name</b> @Html.Raw("<font color=#A9A9A9>(") @x.id @Html.Raw(")</font><br />")


    // check station for bad / dangerous weather
     @*x.weather_station_has_potentially_dangerous_weather @Html.Raw("<br />")*@
    @if (@x.weather_station_has_potentially_dangerous_weather == true)
    {
        // then output any potentially dangerous weather
     @Html.Raw("<font color=#ff0000>")@x.weather_stations_potentially_dangerous_conditions @Html.Raw("</font><br />");
    }

    // visibility
    if (x.dont_show_visibility == false)
    {
        if (@x.visibility_show_value == true && @x.visibility_at_onePointTwoMiles_message_showTF == false)
        {
        @x.visibility  @Html.Raw(" visibility<br />")
        }
        else if (@x.visibility_at_onePointTwoMiles_message_showTF = true)
        {
        @x.visibility_at_onePointTwoMiles_message @Html.Raw(" visibility<br />")
        }
        else
        {
        @x.visibility_inoperative.ToString() @Html.Raw("<br />")
        }
    }
    else
    {
         @x.visibility_inoperative.ToString() @Html.Raw("<br />")
    }

    // air temp
    if (x.dont_show_air_temperature ==false)
    {
        if (@x.air_temperature_show_value == true)
        {
        @x.air_temperature @Html.Raw("&#176; air temperature<br />")
        }
        else
        {
        @x.air_temperature_inoperative.ToString() @Html.Raw("<br />")
        }
    }

    // surface temp
    if (@x.dont_show_surface_temperature == false)
    {
        if (@x.surface_temperature_show_value == true)
        {
        @x.surface_temperature  @Html.Raw("&#176; surface temperature<br />")
        }
        else
        {
        @x.surface_temperature_inoperative.ToString() @Html.Raw("<br />")
        }

    }
    // surface conditions
    if (@x.dont_show_surface_condition == false)
    {
    @x.surface_condition @Html.Raw("<br />")
    }

    // dewpoint
    if (@x.dewwpoint_temperature_show_value == true)
    {
        @x.dewpoint_temperature  @Html.Raw("&#176; dewpoint temperature<br />")
    }
    else
    {
        @x.dewpoint_temperature_inoperative @Html.Raw("<br />")
    }

    // relative humidity
    if (@x.relative_humidity_show_value == true)
    {
        @x.relative_humidity @Html.Raw("&#8453: relative humidity<br />")
    }
    else
    {
        @x.relative_humidity_inoperative @Html.Raw("<br />")
    }

    // wind direction -- speed -- gusts to
    if (@x.dont_show_wind == false)
    {
        @x.all_wind_data @Html.Raw("<br />")
    }




}

@*measurements in disclaimer*@
Temperatures in Fahrenheit, windpeeds in MPH. @Html.Raw("<br />") 

1 Ответ

1 голос
/ 03 февраля 2020

Тем не менее, страница Wx.chstml не загружается, браузер продолжает отображать страницу Wx JS .cs html.

Это потому, что вы использовали ajax. Ajax позволяет отображать возвращаемые данные в текущем представлении.

  • Если вы хотите отобразить Wx.cs html, вы можете добавить возврат html к вашему текущему Wx Js .cs html:

Контроллер:

[HttpPost]
public IActionResult Wx()
{

    ViewBag.WxStatDataList = SortedList;
    return View();
}

Ajax:

<div id="test"></div>

<script>
    $(function() {
    $.ajax({
            url: '/Home/Wx/',
            type: 'POST',
            //...
            contentType: 'application/json',
            success: function (data) {
                $("#test").html(data);
            }
        });
});
  • Если вы действительно хотите перенаправить для Wx.cs html необходимо использовать сеанс для хранения данных из-за времени жизни ViewBag:

1.Контроллер:

[HttpPost]
public void TestWx()
{
     //...
     var SortedList = WxStatDataList.OrderBy(o => o.indexId).ToList();
     HttpContext.Session.SetObject("ComplexObject", SortedList);
     //no need to return View()...
}

[HttpGet]
public IActionResult Wx()
{
    ViewBag.WxStatDataList= HttpContext.Session.GetObject<List<ConcerningWeatherData>>("ComplexObject");
    return View();
}

2. Ajax:

<script>
    $(function() {
    $.ajax({
            url: '/Home/TestWx/',  //change this
            type: 'POST',
            //..
            contentType: 'application/json',
            success: function (data) {
                window.location.href = "/Home/Wx"; //redirect to Wx.cshtml
            }
        });
});    
</script>

3. Расширения сеанса:

using System.Text.Json;
public static class SessionExtensions
{
    public static void SetObject(this ISession session, string key, object value)
    {
        session.SetString(key, JsonSerializer.Serialize(value));
    }

    public static T GetObject<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? default(T) : JsonSerializer.Deserialize<T>(value);
    }
}

4. Зарегистрировать сеанс в Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSession();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{        
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseSession();
    //...

}
...