gpt4 book ai didi

asp.net-mvc - 验证包含嵌套域对象的 Viewmodel

转载 作者:行者123 更新时间:2023-12-01 12:55:13 25 4
gpt4 key购买 nike

我有以下 2 个实体:

 public class Product
{
[Key]
public int ID { get; set; }
[Required]
public string Name { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
[Key]
public int ID { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}

和一个 View 模型

public class ProductCreateOrEditViewModel
{
public Product Product { get; set; }
public IEnumerable<Category> Categories { get; set; }
}

Product 的创建 View 使用此 ViewModel。分类ID在 View 中设置如下:

<div class="editor-field">
@Html.DropDownListFor(model => model.Product.Category.ID,new SelectList
(Model.Categories,"ID","Name"))
@Html.ValidationMessageFor(model => model.Product.Category.ID)
</div>

当表单发布时,我得到一个包含产品和所选类别对象集的 View 模型实例,但由于类别的“名称”属性具有 [Required] 属性,所以 ModelState 无效。

就创建产品而言,我不需要或关心“名称”属性。我怎样才能让模型绑定(bind)工作,这样就不会将其报告为 ModelState 错误?

最佳答案

您应该为您的 View 创建一个正确的 ViewModel。

我认为最好的方法是不要将您的域实体暴露给 View 。

你应该做一个简单的 DTO 从你的实体到你的 View 模型。

这样的类

public class ProductViewModel
{
public int ID { get; set; }
[Required]
public string Name { get; set; }
public int CategoryId? { get; set; }
public SelectList Categories { get; set; }
}

从您的 Controller 将产品映射到您的 View 模型

public ViewResult MyAction(int id)
{
Product model = repository.Get(id);

//check if not null etc. etc.

var viewModel = new ProductViewModel();
viewModel.Name = model.Name;
viewModel.CategoryId = model.Category.Id;
viewModel.Categories = new SelectList(categoriesRepo.GetAll(), "Id", "Name", viewModel.CategoryId)

return View(viewModel);
}

然后在响应帖子的操作中,将您的 viewModel 映射回产品

[HttpPost]
public ViewResult MyAction(ProductViewModel viewModel)
{
//do the inverse mapping and save the product
}

希望你能理解

关于asp.net-mvc - 验证包含嵌套域对象的 Viewmodel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com