ASP.NET MVC中模型和ViewModel之间的交互

时间:2014-06-29 15:53:09

标签: c# asp.net-mvc entity-framework

您能解释ASP.NET MVC中的交互模型和ViewModel吗?

  1. 如果我需要在页面上显示数据但不能编辑,是否要创建ViewModel来显示或使用模型?

  2. 我在存储库中有两个方法。一个返回Model,另一个Model得到。在View中我需要发送模型。我应该将生成的模型转换为将其传递给View的ViewModel,并在收到提交后将其转换回模型以保留它吗?

  3. 例如,我有一个类模型和类ViewModel。

     public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
    }
    
    public class EditItemItemViewModel
    {
        public string Name { get; set; }
        public int Price { get; set; }
    }
    

    在编辑页面上,我点击了编辑项目,并且必须到达控制器:

        [HttpGet]
        public ActionResult EditItem(int id)
        {
           //some code
            return View();
        }
    
    1. 如果我传入没有ID的ViewModel视图,我在哪里可以获取ID?

    2. 如果我以某种方式获得了ID,我需要执行以下操作,这会保存模型吗?

      [HttpPost]
      public ActionResult EditItem(EditItemItemViewModel ViewModel)
      {
      
         var Item = _dataManager.Items.GetItemById("1");
         Item.Name = ViewModel.Name;
         Item.Price = ViewModel.Price;
      
         _dataManager.Items.AddItem(Item);
      
          return View("Sucsess");
      }
      
    3. 你能告诉我如何使用Models和ViewModels吗?

3 个答案:

答案 0 :(得分:1)

您可以通过几种不同的方式获取ID:

@Html.HiddenFor(m => m.Id)

这将包括实际HTTP请求中的属性。

另一种选择是简单地将id作为路线的一部分(这是我通常做的):

@Html.BeginForm("EditItem", "SomeController", new { Id = Model.Id }, FormMethod.Post) {
    ...
}

在这两种情况下,请确保验证用户是否应该能够更新与该ID对应的记录!没有什么可以阻止用户篡改id并向您发送不同的值。

至于是否显示数据库模型或视图模型,这完全取决于您。我总是提倡构建一个视图模型,并将数据库模型保留在图片中,除非在控制器中。我在工作中使用的约定是我需要发送给用户的每个数据库对象,我将创建一个相应的视图模型。因此,如果我有一个名为Product的数据库对象,我将为名为ProductModel的视图构建另一个类。

遵循该模式的一个优点是我之前explained to another user关于模型绑定的问题。

答案 1 :(得分:0)

你发布了你的viewmodel,所以我假设你已经在页面中引用了你的模型

 @model MyNameSpace.EditItemItemViewModel

您的视图模型中是否包含ID?最简单的方法是在模型中包含它,并在创建视图时传递实例化的模型。

[HttpGet]
public ActionResult EditItem(int id)
{
    var myViewModel = new EditItemItemViewModel() { Id = id }; 
    return View(myViewModel);
}

就像贾斯汀所说的那样,将它放在@ Html.BeginForm内部的隐藏字段中更容易,因为id应该仅供参考。

[HttpPost]
public ActionResult EditItem(EditItemItemViewModel viewModel)
{
   var Item = _dataManager.Items.GetItemById(viewModel.Id);
   Item.Name = viewModel.Name;
   Item.Price = viewModel.Price;

   // Should this be an Add?
   _dataManager.Items.AddItem(Item);

    return View("Success");
}

答案 2 :(得分:0)

  

如果我需要在页面上显示数据,而不是编辑,是否要创建ViewModel来显示或使用模型?

如果它非常简单(如你的例子),那么属性就像现在一样映射1-1。我只是将模型用作视图模型,它更容易。虽然如果你想要,你可以创建一个具有完全相同属性的视图模型并填充它并显示它...更多的工作,但这使得你的域模型不一定与你的视图绑定。

如果你这样做,你可能想要查看类似AutoMapper的内容,这样可以让你做类似的事情

//simply copies the properties from one type to another
var viewModel = Mapper.Map<Item, EditItemItemViewModel>();
  

我在存储库中有两个方法。一个返回Model,另一个Model得到。在View中我需要发送模型。我应该将生成的模型转换为将其传递给View的ViewModel,并在收到提交后将其转换回模型以保留它吗?

如果你进入视图模型路线然后是,你将最终在模型和视图模型之间进行大量转换,这就像AutoMapper之类的东西可以提供帮助,或者你可以创建一些扩展方法,在两种类型之间转换。

看起来Justin Helgerson的答案解释了处理模型/视图模型的方法非常好。