2

ActionFilterAttributeユーザーアクティビティのログに基づいてフィルターを作成することを計画しています:

public class LogAttribute : ActionFilterAttribute
{
    public ActionType Type { get; set; }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
      // logic for log
    }
}

コントローラーのアクションでこの属性を使用したいと考えています。X,Y,Zビューでユーザーが設定した値と、アクション関連の情報をログに記録したいと思います。その場合、おそらくこれらの X、Y、Z をパラメーターとしてアクションに送信し、属性コードでこれらの値を ResultExecutedContext から取得する必要があります。しかし、このアプローチは私を少し混乱させました。なぜなら、各アクションに冗長なパラメーターがあるからです。

View から C# コードに値を共有する良い方法はありますか?

4

3 に答える 3

0

値は、ユーザーまたはコードによって、ある時点で設定する必要があります。ただし、Session配列を使用してこれらの値を含めることができます。これらは、ログイン セッションの間保持されます。

セッションに保存するには

Session["key"] = "data";

後でコードで

var val = Session["key"]; // val now has a value of "data";
于 2013-09-18T10:25:02.730 に答える
0

私が使用するのは、リフレクションを使用してモデルをディクショナリにダンプするヘルパー メソッドです。これにより、値を他の場所にコピーする問題がなくなり、すべてが単一の場所「モデル」から出荷されます。

private static Dictionary<string, string> DumpModel(object obt)
        {
            Type type = obt.GetType();
            if (TypeDefinitionIsList(type))
                return null;

            PropertyInfo[] properties = obt.GetType().GetProperties();
            Func<PropertyInfo, string> func = info =>
                                                  {
                                                      if (info.PropertyType.GetInterface(typeof (ICatalogue<>).FullName) != null)
                                                      {
                                                          dynamic propertyValue = info.GetValue(obt, null);
                                                          if (propertyValue != null)
                                                              return string.Format("{{ Id: {0}, Description: {1} }}",
                                                                                   propertyValue.Id,
                                                                                   propertyValue.Description);
                                                          return "null";
                                                      }
                                                      object normalValue = info.GetValue(obt, null);
                                                      if (normalValue == null) return "null";
                                                      return TypeDefinitionIsList(normalValue.GetType()) ? HelpersMessages.NotSupportedList : normalValue.ToString();
                                                  };

            return properties.ToDictionary(x => "model-"+x.Name, func);
        }

フィルター属性で使用できます

var request = filterContext.HttpContext.Request;
object model = filterContext.Controller.ViewData.Model;

そして、あなたは次のようなものを使うことができます

 DumpModel(model);    

値を使用して、必要に応じてログに記録します。これが役立つことを願っています

于 2013-09-18T16:20:13.103 に答える