0

私はMVC3の初心者ですが、これが可能であり、良い習慣であるかどうか疑問に思います。

正常に動作するモデル+ビュー+コントローラーがあります。このビューには人のリストが表示されます。人の名前をクリックして、その人の詳細を表示する新しいビューにリダイレクトできるようにしたいと思います。この新しいビューにはViewModelしかありませんが、アクションでオブジェクトを渡す予定なので、コントローラーはありません。

Personオブジェクトには、ビューに表示する必要のあるすべてのプロパティが含まれています:@ Html.ActionLink(item.Person.FirstName、 "PersonDetails"、item.Person)

これは可能/良い習慣ですか?

4

2 に答える 2

4

MVC の仕組みを誤解していると思います。ActionLink は、常にコントローラーの対応する ActionMethod にリダイレクトされます。必要なパラメーターを受け取り、ViewModel のビューに戻るアクション メソッドをコントローラーに作成します。

以下は、開始するための非常に簡単な例です。

public class HomeController : Controller
{
    public ActionResult List()
    {
        return View();
    }

    public ActionResult DetailById(int i)
    {
        // load person from data source by id = i

        // build PersonDetailViewModel from data returned 

        return View("PersonDetails", PersonDetailViewModel);
    }

    public ActionResult DetailByVals(string FirstName, Person person)
    {
        // build PersonDetailViewModel manually from data passed in
        // you may have to work through some binding issues here with Person
        return View("PersonDetails", PersonDetailViewModel);
    }
}
于 2012-08-07T19:13:22.287 に答える
1

あなたが望むようにそれを行うには良い方法ではありません(元の投稿で)。ビューには常にビュー モデルが必要です。ビューモデルは、ビューに表示したいデータのみを表し、それ以上でもそれ以下でもありません。domail モデルをビューに渡すのではなく、ビュー モデルを使用してください。このビュー モデルには、ドメイン モデルのプロパティの一部のみが含まれている場合があります。

リスト ビューにはおそらくグリッドがあり、各行の横にはおそらく詳細リンクまたは名前へのリンク (お持ちのとおり) があります。これらのリンクのいずれかをクリックすると、詳細ビ​​ューが表示されます。この詳細ビューには、詳細ビューに表示する必要があるプロパティのみを含む独自のビュー モデルがあります。

domail モデルは次のようになります。

public class Person
{
     public int Id { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int Age { get; set; }

     public string ExampleProperty1 { get; set; }

     public string ExampleProperty2 { get; set; }

     public string ExampleProperty3 { get; set; }
}

人のID、名、姓、年齢のみを表示したい場合、ビューモデルは次のようになります。

public class PersonDetailsViewModel
{
     public int Id { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int Age { get; set; }
}

ExampleProperty1、ExampleProperty2、および ExampleProperty3 は必要ないため、必要ありません。

個人コントローラーは次のようになります。

public class PersonController : Controller
{
     private readonly IPersonRepository personRepository;

     public PersonController(IPersonRepository personRepository)
     {
          // Check that personRepository is not null

          this.personRepository = personRepository;
     }

     public ActionResult Details(int id)
     {
          // Check that id is not 0 or less than 0

          Person person = personRepository.GetById(id);

          // Now that you have your person, do a mapping from domain model to view model
          // I use AutoMapper for all my mappings

          PersonDetailsViewModel viewModel = Mapper.Map<PersonDetailsViewModel>(person);

          return View(viewModel);
     }
}

これでもう少し問題が解決することを願っています。

于 2012-08-08T07:18:56.287 に答える