C# ASP.NET MVC中模型与视图模型的交互
你能解释一下ASP.NET MVC中的交互模型和视图模型吗C# ASP.NET MVC中模型与视图模型的交互,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,你能解释一下ASP.NET MVC中的交互模型和视图模型吗 如果我需要在页面上显示数据,但不需要编辑,是创建要显示的ViewModel还是使用该模型 我在存储库中有两种方法。一个返回模型,另一个得到。在视图中,我需要发送模型。我是否应该将生成的模型转换为ViewModel,然后将其传递给视图,并在收到提交后将其转换回模型以保留它 例如,我有一个类模型和类视图模型 public class Item { public int Id { get; set; } public str
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();
}
[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");
}
您能告诉我如何使用模型和ViewModels吗?您可以通过几种不同的方式获得id:
@Html.HiddenFor(m => m.Id)
这将包括实际HTTP请求中的属性
另一种选择是简单地将id作为路线的一部分(这是我通常做的):
在这两种情况下,确保用户能够更新与该id对应的记录!没有什么可以阻止用户篡改id并向您发送不同的值
至于是否显示数据库模型或视图模型,这实际上取决于您。我一直主张构建一个视图模型,并将数据库模型排除在画面之外,控制器中除外。我在工作中使用的约定是,对于我需要发送给用户的每个数据库对象,我将创建相应的视图模型。因此,如果我有一个名为Product
的数据库对象,我将为名为ProductModel
的视图构建另一个类
遵循这种模式的一个优点就是我在前面提到的模型绑定。您发布了viewmodel,因此我假设您已经在页面中引用了您的模型
@model MyNameSpace.EditItemItemViewModel
是否存在视图模型中不包含id的原因?最简单的方法是将其包含在模型中,并在创建视图时传递实例化的模型
[HttpGet]
public ActionResult EditItem(int id)
{
var myViewModel = new EditItemItemViewModel() { Id = id };
return View(myViewModel);
}
正如Justin所说,将其放在@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");
}
如果我需要在页面上显示数据,但不需要编辑,是创建要显示的ViewModel还是使用该模型
如果它非常简单(就像你的例子),属性映射1-1就像现在一样。我只是将模型用作视图模型,这样更容易。尽管如果您愿意,您可以创建一个具有完全相同属性的视图模型,然后填充并显示它。这需要更多的工作,但可以使您的域模型不必与视图绑定
如果你这样做了,你可能会想研究一些类似的东西,这将允许你做一些类似的事情
//simply copies the properties from one type to another
var viewModel = Mapper.Map<Item, EditItemItemViewModel>();
//只需将属性从一种类型复制到另一种类型
var viewModel=Mapper.Map();
我在存储库中有两种方法。一个返回模型,另一个得到。在视图中,我需要发送模型。我是否应该将生成的模型转换为ViewModel,然后将其传递给视图,并在收到提交后将其转换回模型以保留它
如果您选择视图模型路线,那么是的,您将在模型和视图模型之间进行大量转换,这是AutoMapper之类的工具可以提供帮助的地方,或者您可以创建一对扩展方法,在这两种类型之间进行转换
贾斯汀·赫尔格森(Justin Helgerson)解释处理模型/视图模型的方法的回答似乎很好。谢谢,我想知道如何组织模型和视图模型之间的关系!
//simply copies the properties from one type to another
var viewModel = Mapper.Map<Item, EditItemItemViewModel>();