填充ViewModel

时间:2019-02-06 16:07:41

标签: c# asp.net-mvc model-view-controller

我一直在网上搜索以找到此类简单问题的答案,但似乎找不到。

假设我们有一个带有编辑页面的产品,我们可以在其中设置名称,价格和类别。

遵循MVC(MVVM)模式,我们有:

  • 2个模型 ProductModel ProductCategoryModel
  • 保存产品和类别列表(用于下拉菜单)的ViewModel
  • 查看以显示编辑页面

除了上述内容之外,我们还具有处理CRUD操作的ProductService

// Model
public class ProductModel
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int CategoryId { get; set; }
}

// Model
public class ProductCategoryModel
{
        public int CategoryId { get; set; }
        public string Name { get; set; }
}

// ViewModel
public class EditProductViewModel
{
    public ProductModel Product { get; set; }
    public List<ProductCategoryModel> Categories { get; set; }
}

问题是谁负责填充ViewModel?我虽然可以在视图模型的构造函数中完成此操作,但是人们说这是不好的做法。在控制器中填充它似乎也不正确。

1 个答案:

答案 0 :(得分:0)

您将在页面控制器中从ProductModel / ProductCategoryModel映射EditProductViewModel。 然后,您可以调用操作以呈现html页面并传递viewModel对象。

类似这样的东西:

public class HomeController : Controller
{

    private EditProductViewModel viewModel;

    public HomeController()
    {
        this.viewModel = new EditProductViewModel();
        InitialiseViewModel();
    }

    public ActionResult Index()
    {

        return View("Index", viewModel);
    }

    private void InitialiseViewModel()
    {
        ProductCategoryModel productCategoryModel = new ProductCategoryModel();
        ProductModel productModel = new ProductModel();

        //do your mapping 
        productModel.Name = "Test mapping";
        this.viewModel.Product = productModel;
    }
}

您的.cshtml如下所示

@model WebApplication5.ViewModels.EditProductViewModel

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p>@Model.Product.Name</p>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
</div>