Как использовать атрибут TempData для передачи данных в представление Razor - PullRequest
1 голос
/ 08 мая 2020

У меня есть:

namespace Test
{
    public interface ITest
    {
        public string Test1(string s);
    }

    public class Test : ITest   
    {
        [Microsoft.AspNetCore.Mvc.TempData]
        public string Message
        {
            get; set;
        }
        public string Test1(string s)
        {
            Message = "Test " + s;
            return "Test has run";
        }
    }
}

И в Startup.cs:

services.AddScoped<Test.ITest, Test.Test>();

Затем в представлении Razor:

@inject Test.ITest Test

<p>Result is @Test.Test1("Hello World!")</p>
<p>TempData["Message"] is @TempData["Message"]</p>

Результат:

Result is Test has run

TempData["Message"] is

Где я неправильно сделал? Как передать TempData["Message"] из некоторого кода (которого нет в контроллере) на страницу Razor?

1 Ответ

0 голосов
/ 14 мая 2020

Как я могу передать TempData ["Message"] из некоторого кода (которого нет в контроллере) на страницу Razor?

Если вы хотите сохранить и передать значение через TempData внутри вашей настраиваемой службы, вы можете попробовать следующий фрагмент кода.

public interface ITest
{
    public string Test1(string s);
    public string Test2();
}

public class Test : ITest
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public Test(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public string Message
    {
        get {
            var tempDataDictionaryFactory = _httpContextAccessor.HttpContext.RequestServices.GetRequiredService<ITempDataDictionaryFactory>();
            var tempDataDictionary = tempDataDictionaryFactory.GetTempData(_httpContextAccessor.HttpContext);
            if (tempDataDictionary.TryGetValue("Message", out object value))
            {
                return (string)value;
            };

            return "";
        }
        set
        {
            var tempDataDictionaryFactory = _httpContextAccessor.HttpContext.RequestServices.GetRequiredService<ITempDataDictionaryFactory>();
            var tempDataDictionary = tempDataDictionaryFactory.GetTempData(_httpContextAccessor.HttpContext);
            tempDataDictionary.Remove("Message");
            tempDataDictionary.TryAdd("Message", value);
        }
    }
    public string Test1(string s)
    {
        Message = "Test " + s;
        return "Test has run";
    }

    public string Test2()
    {
        return Message;
    }
}

На странице Razor

<p>Result is @Test.Test1("Hello World!")</p>
<p>TempData["Message"] is  @TempData.Peek("Message")</p>

<p>@Test.Test2()</p>

Результат теста

enter image description here

...