Как передать список строк в TempData Asp.Net - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть Tempada, чтобы показать список ошибок в сообщении об ошибке, я создаю список, и в моем foreach каждая ошибка находит его, я добавляю ошибку в свой список и позже я показываю этот список в TempData

public IActionResult Demo()
{
    List<string> LogErros = new List<string>();
    try
    {      
        foreach (var item in somethings)
        {
            // if have some error add to list   
            LogErros.add();
        }
        if (LogErros.Count > 0)
        {
            TempData["error-message"] = LogErros;
        }
    }
    return View();
}

Я пытаюсь это:

@if (TempData["error-message"] != null)
{
    <div class="alert alert-danger alert-dismissable">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>
        @TempData["error-message"]
    </div>
}

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Проблема в том, что вы отображаете @TempData["error-message"] в своем представлении, но TempData равно , по существу, Dictionary<string, object>, что означает, что при доступе к значению с этой клавишей значение равно объект .

Даже если вы приведете к его фактическому значению (List<string>), он будет неявно вызывать .ToString(), что не будет автоматически отображать содержимое списка, если вы просто используете символ @ для рендеринга на странице..

Первое, что вам нужно сделать, это привести ваш объект к List<string>:

var errorMessageList = TempData["error-message"] as List<string>;

Затем вы можете перебрать значения в списке:

var errorMessageList = TempData["error-message"] as List<string>;
@if (errorMessageList != null)
{
    <div class="alert alert-danger alert-dismissable">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>
        @foreach(var message in errorMessageList)
        {
            @message
        }
    </div>
}

Конечно, вам придется отформатировать это так, как вы хотите, может быть, это должно быть разделено запятыми?Может быть, это должно быть по-своему <span> ... Это зависит от вас.

0 голосов
/ 25 апреля 2018

TempData["error-message"] хранит список строк как Object.Поэтому вам нужно сначала получить это, привести его к списку строк, пройтись по каждой из них и отобразить его.

Razor в основном вызывает ToString в выражении (в вашем случае,object) и, следовательно, вы видите свои текущие результаты

Это должно работать

@if (TempData["error-message"] != null)
{
    var errors = TempData["error-message"] as List<string>;
    <div class="alert alert-danger alert-dismissable">
        <button type="button" class="close" data-dismiss="alert" >x</button>
        @foreach(var errorMessage in errors)
        {
            <p>@errorMessage</p>
        }
    </div>
}

Хотя это работает, я рекомендую не помещать много кода C # в представление.Если это основной проект asp.net, я бы порекомендовал создать помощник по тегам для этого.Вот очень простой.

[HtmlTargetElement("div", Attributes = "messages")]
public class AlertMessagesTagHelper : TagHelper
{
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        StringBuilder str = new StringBuilder();

        var messages = ViewContext.TempData["error-message"] as List<string>;
        if (messages != null && messages.Any())
        {
            str.Append("<div class='alert alert-danger alert-dismissable'>");
            foreach (var message in messages)
            {
                str.AppendFormat("<div>{0}</div>", message);

            }
            str.Append("</div>");
        }
        output.Content.AppendHtml(str.ToString());
    }
}

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

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyName

Теперь в вашем представлении или макете вы можетевызовите этот помощник тега, используя элемент div с атрибутом messages

<div messages></div>

Не стесняйтесь обновлять код помощника тега для отображения разметки HTML, которую вы хотите для сообщений.

ДляОсновные проекты, не относящиеся к ASP.Net, вы можете создать вспомогательный метод HTML, который делает то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...