3

Asp.Net Mvc WebapiRCを使用しています。

カスタム属性を使用して、モデルクラスのフィールド/プロパティを非表示にしたかったのです。以下は私のクラスです:

public class Employee
{              
     public int EmpId { get; set; }       
     public string Name{ get; set; }

     //Wanted to hide this attribute based on custom logic. Like for a certain role, i want to hide the designation
     public string Designation{ get; set; }

     public string Department{ get; set; }
}

データ注釈を使用してどのように達成できますか。つまり、この方法で使用する別の属性を作成したかったのです。

[HideForRoles(Roles="Admin,Writer")]
public string Designation{ get; set; }

アップデート :

私はWebAPIを開発しています。応答は、フォーマッターに応じてXMLまたはJson形式のいずれかにシリアル化されます。したがって、より良い質問は、応答への書き込み中にフィールドをシリアル化できないようにする方法です。

ただし、1つのオプションはIgnoreDataMember属性を使用することです。好き

[IgnoreDataMember]
public string Designation{ get; set; }

しかし、上記はコンパイル時の宣言であり、条件を課すことはできません。

質問:実行時の条件に基づいてシリアル化するときにフィールド/プロパティを無視するにはどうすればよいですか?

4

4 に答える 4

2

申し訳ありませんが、WebApiを使用していた最初のラウンドを完全に見逃しました。

あなたがしたいのは、カスタムフォーマッタを作成することです。

MVCとWebApiのフロー/違いに関する優れた記事がここにあります(これはすでに理解していると思いますが、まだいくつかの有効なポイントがあります):http: //lostechies.com/jimmybogard/2012/04/10/asp -net-web-api-mvc-viewmodels-and-formatters /

そして、これがカスタムフォーマッターのサンプル実装です: http ://www.tugberkugurlu.com/archive/creating-custom-csvmediatypeformatter-in-asp-net-web-api-for-comma-separated-values-csv-format

それから構築するには、リフレクションを使用して属性から読み取り、作成する必要のあるカスタムActionFilterAttributeに基づいて構築します。ここで、ユーザーの役割を評価し、どのフィールドを省略/含めるかを決定します。アクションフィルターのサンプルは次のとおりです: https ://github.com/MisterJames/MovieFu/blob/master/MovieFu/ActionFilters/UserNameFilter.cs

これがもっと役立つことを願っています。

乾杯。

于 2012-07-12T14:55:24.943 に答える
1

最善の策は、dynamicオブジェクトを返すことです。この場合、次のように言うことができます。

        dynamic viewModel = new ExpandoObject();
        viewModel.Id = 12;
        if(role == "Admin")
        {
            viewModel.SecureStuff = "Others should not see it";
        }
于 2012-07-12T09:39:30.733 に答える
0

ビューでフィールドを条件付きでレンダリングする必要があるため、それほど単純ではありません。しかし、あなたは属性を通してそこへの道のほとんどを得ることができます。

カスタム属性のメタデータを認識してから、ビューで属性を確認する必要があります。解決策はここに掲載されています:MVC3HTMLヘルパーでカスタム属性値を取得できません

乾杯。

于 2012-07-10T16:52:20.633 に答える
0

モデルリポジトリ自体で認証チェックを行いました。むしろ理想的な方法は、特定の条件に基づいて特定のフィールドを非表示にするカスタムフォーマッターを作成することでした。

dbから従業員のリストを取得し、それらをリストに入れた後、もう一度繰り返して、表示したくないフィールドにNULLを配置しました。私が書いたコード:

foreach (var employee in listEmployees)
{
     //get all props. of Employees object using reflection
     var props = employee .GetType().GetProperties();

     //loop through each field to match with the field name to remove/place null
     foreach (var propertyInfo in props)
     {
          var fieldName = propertyInfo.Name;
          if (fieldsNamesToRemove .Contains(fieldName))
          {
                    propertyInfo.SetValue(employee , null, null);
          }
     }
 }

ここでfieldsNamesToRemoveは、現在のユーザーのロールに基づいて動的に作成したリストです。

このソリューションは、実際には表示したくないフィールドにNULLを配置します。その結果、JSon形式ではフィールドは表示されませんが、XMLではフィールドはltのような構文で表示されます。指定i:nil = "true" / gt;ですが、主にjson応答を処理する必要があるため、管理しやすくなっています。

貴重な提案をしてくれたAliとMisterJamesに感謝します

于 2012-07-13T07:39:06.077 に答える