我是否可以基于ViewModel添加视图,而无需为新添加的视图提供控制器?

时间:2012-08-07 19:09:59

标签: asp.net-mvc-3

我是MVC3的新手,我想知道这是否可能和良好做法?

我有一个模型+视图+控制器,工作正常。此视图显示了一个人员列表 - 我希望能够单击某人的姓名并重定向到将显示该人员详细信息的新视图。这个新视图只有一个ViewModel,但没有控制器,因为我打算在操作中传入对象。

Person对象包含我的视图需要显示的所有属性:     @ Html.ActionLink(item.Person.FirstName,“PersonDetails”,item.Person)

这可能/良好做法吗?

2 个答案:

答案 0 :(得分:4)

我相信你对MVC的运作方式有误解。您的ActionLink将始终重定向到Controller的相应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);
    }
}

答案 1 :(得分:1)

不是像你想要的那样(在原帖中)这样做的好方法。视图应始终具有视图模型。视图模型仅表示您希望在视图上拥有的数据,仅此而已。不要将您的domail模型传递给视图,而是使用视图模型。此视图模型可能只包含域模型属性的portain。

在列表视图中,您可能有一个网格,每行旁边可能有一个详细信息链接,或者名称上的链接(就像您拥有的那样)。单击这些链接中的任何一个时,您将被定向到详细信息视图。此详细信息视图将具有自己的视图模型,其中仅包含您需要在详细信息视图上显示的属性。

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);
     }
}

我希望这会让事情更加清晰。