2016-05-04 17 views
2

Levelnisのブログからメッセージクラスを実装しようとすると、コンパイルエラーが発生します。asp.net MVC6タグビルダークラスを実装し、 ".ToString"でエラーを取得します。

問題のクラスがある: - 私は2つのエラーを取得しています

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 

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

buttonTag.InnerHtml = "×"; 

、それは言う:

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

私はドキュメントや他の記事を見て持っていたが、これまでのところ、私は私が正しくコンパイルするために、これを修正することができます何かを発見していない...

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

+0

[this](http://www.mikesdotnetting.com/article/274/introducing-taghelpers-in-asp-net-mvc-6)チュートリアルを参考にしてください。 tagbuilderの代わりにtaghelperを使用します。私はそれがよりクリーンでより理解しやすいコード&htmlで解決すると思います –

+0

ありがとうTom。私はステップバックし、Tempdataメッセージを作成する私のアプローチを変更することを決めた - 私の答えを参照してください.. – si2030

答えて

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を使用して複雑なオブジェクトを送信できないという点で問題がありました。これは、Stackoverflow questionの@Hemの答えを使用して解決されました。ここでは、複雑なオブジェクトを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); 
    } 
} 

これは今や魅力的です。

1

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

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

それは私のために働いたこの道を:InnerHtmlは以下のようにAppend()メソッドを使用し設定するには

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

:代わりに以下のようにToString()方法の使用StringWriterWriteTo()方法の

関連する問題