0

私が開発中のテスト用 ASP.NET MVC アプリケーションで Automapper に関する質問がありましたが、助けていただければ幸いです。

私は周りを見回しましたが、ネストされたViewModelで達成しようとしているものとまったく同じものを見つけることができませんでした.

基本的に、私はこれらの 2 つのドメイン モデルを持っています…</p>

namespace Test.Domain.Entities
{
    public class Contact
    {
        [HiddenInput(DisplayValue = false)]
        [Key]
        public int ID { get; set; }

        public Name Name { get; set; }

        public string Contact_Landline { get; set; }

        public string Contact_Mobile { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Contact_Email { get; set; }
    }
}

と..

namespace Test.Domain.Entities
{
    public class Name : DisplayableModel
    {
        [HiddenInput(DisplayValue = false)]
        [Key]
        public int ID { get; set; }

        public string Name_Forename { get; set; }

        public string Name_Surname { get; set; }

        public string GetFullName()
        {
            return Name_Forename + ' ' + Name_Surname;
        }
    }
}

そして、私はこれらの 2 つの ViewModel を持っています…</p>

namespace Test.WebUI.Models
{
    public class ContactViewModel :
    {
        [HiddenInput(DisplayValue = false)]
        [Key]
        public int ID { get; set; }

        public NameViewModel Name { get; set; }

        public string Contact_Landline { get; set; }

        public string Contact_Mobile { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Contact_Email { get; set; }
    }
}

そして…</p>

namespace Test.WebUI.Models
{
    public class NameViewModel 
    {
        [HiddenInput(DisplayValue = false)]
        [Key]
        public int ID { get; set; }

        public string Name_Forename { get; set; }

        public string Name_Surname { get; set; }
    }
}

Contact ドメイン オブジェクトを設定する Name プロパティが設定された Name プロパティを使用して、ContactViewModel をビューに返したいと考えています。

コントローラーにこのコードがあります…</p>

Mapper.CreateMap<Name, NameViewModel>();
Mapper.CreateMap<Contact, ContactViewModel>();
var contact = Mapper.Map<Contact, ContactViewModel>(repository.Contact.Where(c => c.ID == id).Single()); 
return View(contact);

ここで問題が発生します。私の Name プロパティには値が入力されません。

この方法でアプリケーションを設計することを選択した理由は、この単純な例のように、コードを繰り返さずに NameViewModel オブジェクトを一貫してレンダリングできるように、ビューがカスタム モデル テンプレートで構成されているためです…</p>

@model Test.WebUI.Models.NameViewModel

First
@Model.Name_Forename
Last
@Model.Name_Surname

ContactViewModel の NameViewModel オブジェクトに AutoMapper を設定する方法を説明してくれる人がいれば、本当に感謝しています。

ありがとう。ジム

4

2 に答える 2

1

これは、次に示すように、すぐに使用できるはずです。

public class Name 
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int ID { get; set; }

    public string Name_Forename { get; set; }

    public string Name_Surname { get; set; }

    public string GetFullName()
    {
        return Name_Forename + ' ' + Name_Surname;
    }
}


public class Contact
{
    public int ID { get; set; }

    public Name Name { get; set; }

    public string Contact_Landline { get; set; }

    public string Contact_Mobile { get; set; }

    public string Contact_Email { get; set; }
}

public class NameViewModel
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int ID { get; set; }

    public string Name_Forename { get; set; }

    public string Name_Surname { get; set; }

}

public class ContactViewModel
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int ID { get; set; }

    public NameViewModel Name { get; set; }

    public string Contact_Landline { get; set; }

    public string Contact_Mobile { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Contact_Email { get; set; }
}


class Program
{
    static void Main()
    {
        Mapper.CreateMap<Name, NameViewModel>();
        Mapper.CreateMap<Contact, ContactViewModel>();

        var contact = new Contact
        {
            Name = new Name
            {
                Name_Forename = "forename"
            }
        };
        var vm = Mapper.Map<Contact, ContactViewModel>(contact);
        Console.WriteLine(vm.Name.Name_Forename);
    }
}

期待どおりに印刷されます:

forename

そのため、呼び出しが、プロパティが正しくインスタンス化され、そのプロパティの値を含むインスタンスをrepository.Contact.Where(c => c.ID == id).Single()返すことを確認してください。ContactName

さて、そうは言っても、コードにはいくつかの問題があります。

  • [HiddenInput]ビュー固有のものであり、ビューモデルに属する属性でドメインモデルのプロパティを装飾しました。
  • ビューモデルのプロパティを[Key]属性で装飾しました。これは、ビューモデルが不可知であるべきデータアクセス固有のものです。
  • Mapper.CreateMap<TSource, TDest>コントローラーアクション内でメソッドを呼び出しています。これは間違っています。マッピング定義は、アプリケーション ドメインの存続​​期間全体で 1 回だけ実行する必要があります。これは通常、内部で呼び出されるヘルパー メソッドで発生し、Application_Startマッピング定義が 1 回だけ実行されるようにします。コントローラー アクション内では、Mapper.Map<TSource, TDest>メソッドを使用して実際のマッピングを実行する必要があります。
于 2012-06-10T19:59:08.677 に答える
0

前に述べたように、(APP_Start フォルダーで) マッピングを 1 回だけ定義する必要があります。これがまさに必要なものかどうかはわかりませんが、次の方法でマッピングを行うことができます。

Mapper.CreateMap<Contact, ContactViewModel>()
.ForMember(c => c.Name, opt => opt.MapFrom(o => o.Name_Forename + " " + o.Name.Lastname);
于 2012-06-11T09:51:40.517 に答える