您能解释ASP.NET MVC中的交互模型和ViewModel吗?
如果我需要在页面上显示数据但不能编辑,是否要创建ViewModel来显示或使用模型?
我在存储库中有两个方法。一个返回Model,另一个Model得到。在View中我需要发送模型。我应该将生成的模型转换为将其传递给View的ViewModel,并在收到提交后将其转换回模型以保留它吗?
例如,我有一个类模型和类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();
}
如果我传入没有ID的ViewModel视图,我在哪里可以获取ID?
如果我以某种方式获得了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");
}
你能告诉我如何使用Models和ViewModels吗?
答案 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的答案解释了处理模型/视图模型的方法非常好。