2

尝试从Levelnis的博客实现消息类时出现编译错误。

有问题的课程是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Rendering;

namespace Notifier.Helpers.MessageNotifier
{
    public class Message
    {
        public MessageSeverity Severity { get; set; }

        public string Text { get; set; }

        public string Generate()
        {
            var isDismissable = Severity != MessageSeverity.Danger;
            if (Severity == MessageSeverity.None) Severity = MessageSeverity.Info;
            var sb = new StringBuilder();
            var divTag = new TagBuilder("div");
            divTag.AddCssClass("alert fade in");
            divTag.AddCssClass("alert-" + Severity.ToString().ToLower());


            var spanTag = new TagBuilder("span");
            spanTag.MergeAttribute("id", "MessageContent");

            if (isDismissable)
            {
                divTag.AddCssClass("alert-dismissable");
            }

            sb.Append(divTag.ToString(TagRenderMode.StartTag));

            if (isDismissable)
            {
                var buttonTag = new TagBuilder("button");
                buttonTag.MergeAttribute("class", "close");
                buttonTag.MergeAttribute("data-dismiss", "alert");
                buttonTag.MergeAttribute("aria-hidden", "true");
                buttonTag.InnerHtml = "×";
                sb.Append(buttonTag.ToString(TagRenderMode.Normal));
            }

            sb.Append(spanTag.ToString(TagRenderMode.StartTag));
            sb.Append(Text);
            sb.Append(spanTag.ToString(TagRenderMode.EndTag));
            sb.Append(divTag.ToString(TagRenderMode.EndTag));

            return sb.ToString();
        }
    }
}

我收到两个错误 - 第一个与在线上的“.ToString”有关:

sb.Append(divTag.ToString(TagRenderMode.StartTag));

它说:

No overload for method 'ToString' takes 1 arguments

第二个错误与该行有关:

buttonTag.InnerHtml = "×";

它说:

Property or indexer 'TagBuilder.InnerHtml' cannot be assigned to -- it is read only

我已经查看了文档和其他帖子,但到目前为止我还没有找到任何可以帮助我修改它以正确编译的东西......

这些方法在 Asp.net-core 中的实现方式是否不同,如果不是,有人可以建议另一种方法来执行这些行吗?

4

2 回答 2

2

似乎 TagBuilder 在 MVC6 中的工作方式与在 MVC5 中的工作方式不同。

而不是ToString()使用方法StringWriterWriteTo()方法如下:

StringBuilder result = new StringBuilder();
TagBuilder tag = new TagBuilder("a");
tag.AddCssClass("btn btn-default");  
using (var writer = new StringWriter())
{
  tag.WriteTo(writer, HtmlEncoder.Default);
  result.Append(writer.ToString());
}  

设置InnerHtml使用Append()方法如下:

tag.InnerHtml.Append(i.ToString()); 

这种方式对我有用。

于 2016-11-05T17:27:41.137 回答
0

这与实现在后续页面上放置消息的方式有关 - 最初使用 Levilnis 的博客。

无法在没有问题的情况下实现这一点,我退后一步,寻找另一种方法。我使用了James 先生提出的一种方法,特别是使用 baseController 来保存我所有可能的消息。我简化了一点,因为我不需要运行多条消息——每页只需要一条。

public class BaseController : Controller
{
    public void Success(string message, bool dismissable = false)
    {
        AddAlert(AlertStyles.Success, message, dismissable);
    }

    public void Information(string message, bool dismissable = false)
    {
        AddAlert(AlertStyles.Information, message, dismissable);
    }

    public void Warning(string message, bool dismissable = false)
    {
        AddAlert(AlertStyles.Warning, message, dismissable);
    }

    public void Danger(string message, bool dismissable = false)
    {
        AddAlert(AlertStyles.Danger, message, dismissable);
    }

    private void AddAlert(string alertStyle, string message, bool dismissable)
    {
        var alert = new Alert
        {
            AlertStyle = alertStyle,
            Message = message,
            Dismissable = dismissable
        };

         TempData.Put(Alert.TempDataKey, alert);
    }

}

在 MVC6 中,您不能使用 Tempdata 发送复杂的对象。这是使用@Hem 在此Stackoverflow 问题中的回答解决的,他建议使用将复杂对象转换为 json 字符串的扩展。为此,我确实没有添加使用“使用 Newtonsoft.Json;”。

public static class TempDataExtensions
{
    public static void Put<T>(this ITempDataDictionary tempData, string key, T value) where T : class
    {
        tempData[key] = JsonConvert.SerializeObject(value);
    }

    public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class
    {
        object o;
        tempData.TryGetValue(key, out o);
        return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
    }
}

这现在就像一个魅力。

于 2016-05-06T01:16:12.260 回答