如何将List String传递给TempData Asp.Net

时间:2018-04-25 19:20:39

标签: c# asp.net asp.net-mvc

我有一个Tempada在msg错误中显示错误列表,我创建一个List并在我的foreach中,每个错误找到它,我在我的List中添加一个错误,然后我在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>
}

但得到错误 enter image description here

2 个答案:

答案 0 :(得分:1)

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

现在在您的视图或布局中,您可以使用带有messages属性的div元素

来调用此标记帮助器
<div messages></div>

随意更新标记帮助程序代码,以呈现消息所需的HTML标记。

对于Non-Asp.Net核心项目,您可以创建一个html帮助器方法,它可以执行相同的操作。

答案 1 :(得分:0)

问题是您在视图中显示@TempData["error-message"],但TempDataessentially a Dictionary<string, object>,这意味着当您访问该键的值时,该值为对象< / em>的。

即使你转换为它的实际值(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> ......这取决于你。