Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC中模型与视图模型的交互_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 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

你能解释一下ASP.NET MVC中的交互模型和视图模型吗

  • 如果我需要在页面上显示数据,但不需要编辑,是创建要显示的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");
    }
    

  • 您能告诉我如何使用模型和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>();