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();
        }
    }
}

2 つのエラーが発生しています。最初のエラーは、次の行の「.ToString」に関連しています。

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

そしてそれは言います:

No overload for method 'ToString' takes 1 arguments

2 番目のエラーは、次の行に関連しています。

buttonTag.InnerHtml = "×";

そしてそれは言います:

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

ドキュメントや他の投稿を見てきましたが、これまでのところ、これを修正して正しくコンパイルするのに役立つものは見つかりませんでした...

これらのメソッドは Asp.net-core で異なる方法で実装されていますか?そうでない場合、誰かがこれらの行を実行する別の方法を提案できますか?

4

2 に答える 2

2

TagBuilder は、MVC5 と同じように MVC6 では機能しないようです。

メソッドの代わりに、以下の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 のブログを使用していました。

問題なくこれを実装することができませんでした。私は一歩下がって、これを行う別の方法を探しました。私はMister Jamesによって提示されたアプローチを使用し、特に baseController を使用してすべての可能なメッセージを保持しました。複数のメッセージを実行する必要がなく、ページごとに 1 つだけだったので、少し単純化しました。

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 を使用して複雑なオブジェクトを送信できないという問題がありました。これは、複雑なオブジェクトをjson文字列に変換する拡張機能を使用することを提案するこのStackoverflowの質問で@Hemの回答を使用して解決されました。これを機能させるには、「using 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 に答える