2 回目以降の呼び出し (Ajax GET 呼び出し) でAutoMapper
、以前の値 (アクション リンクのクリックによる最初の呼び出しの値) を再利用している状況があります。それは「キャッシング」の問題のようなものです...
public virtual ActionResult List(int assessmentId, int? chapterId, bool? isMenuClick)
{
Mapper.CreateMap<Element, AssessmentQuestionViewModel>().
ForMember(dest => dest.AssessmentId, opt => opt.MapFrom(e => assessmentId));
...
}
UseValue
を使用するResolveUsing
かMapFrom
、上記のopt =>
ラムダで使用するかは問題ではありません。動作は同じです。つまり、以前の呼び出しからの値を再利用します。
AssessmentId
プロパティがソース タイプ ( ) に存在しませんElement
。AssessmentId
このようにして、このコードがあるメソッドへの後続の呼び出し中に動的に「変更される可能性がある」値を割り当てようとします。assessmentId
上記のメソッド シグネチャに示されているように、ASP.NET MVC アクション メソッドのパラメーターです。
List
次に、アクション メソッドで次のコードを呼び出します。
var questions =
Mapper.Map<IEnumerable<Element>, IEnumerable<AssessmentQuestionViewModel>>
(Database.Elements.Where(e => !elementIds.Contains(e.ElementId) &&
e.Standard.ChapterId == chapterId));
1 回目questions
は問題ありません。つまり、すべてのAssessmentQuestionViewModel
オブジェクトのプロパティが定義AssessmentId
どおりに正しく設定されています。CreateMap
2回目の呼び出しから、1回目の呼び出しから再利用assessmentId
し、ビジネスロジックを台無しにします。これは、メソッドにパラメーターとして渡されているAssessmentId
更新済みにマップすることを期待しているためです。assessmentId
List
assessmentId
念のため: コードにブレークポイントを設定したところ、パラメーターの値が正しいことがわかります。questions
プロパティに間違った値 (AssessmentId
現在の値とは異なる値) を持つのは、返されたマップされたオブジェクトだけassessmentId
です。AutoMapper にその現在の値を使用してマッピングを行うように依頼しているので、値は私が理解しているように等しいはずです。
AutoMapper 2.2.1-ci9000 (プレリリース) を持っていますが、これを以前のバージョンでテストしたところ、同じ動作が見られました。この「不正行為」はなくなるだろうと考えて、プレリリースにアップデートしました。
これはバグだと思います。私が間違っている場合、またはサポートされていない方法で使用しようとしている場合は、修正してください。:)