Tôi có hai ViewModels (giản thể):Xác nhận của ViewModels lồng nhau
public class ParentViewModel
{
public ParentViewModel
{
Content = new ChildViewModel();
}
public ChildViewModel Content { get; set, }
}
public class ChildViewModel
{
[Required]
public string Name1 { get; set, }
[Required]
public string Name2 { get; set, }
}
Và bộ điều khiển bài hành động sau đây:
[HttpPost]
public ActionResult Create(ParentViewModel viewModel)
{
if (ModelState.IsValid)
{
// process viewModel -> write something into database
return RedirectToAction("Index");
}
return View(viewModel);
}
Bây giờ tôi đang gửi các giá trị hình thức sau đây trong một cơ thể bài yêu cầu URL tương ứng với hành động đó (theo cách thủ công trong Trình yêu cầu Fiddler):
Content.Name1 = X
này hoạt động tốt, tài sản
Name1
được điền vàoviewModel.Content
,Name2
lànull
và tình trạng mô hình này là không hợp lệ vìName2
là bắt buộc. Vì vậy, xác nhận không thành công như mong đợi.Xontent.Name1 = X hoặc Name1 = X hoặc bất cứ điều gì để không có gì bị ràng buộc với
viewModel
Bây giờ
viewModel.Content
không phải lànull
(vì tôi đang instantiating nó trong constructor) nhưng tất cả thuộc tínhName1
vàName2
lànull
. Điều này được mong đợi. Điều tôi đã làm không phải là kỳ vọng là trạng thái mô hình là hợp lệ, vì vậy nó vượt qua xác thực (dẫn đến ngoại lệ DB sau này vì có các cột không thể vô hiệu).
Làm cách nào để cải thiện mã này để xác thực cũng hoạt động trong trường hợp thứ hai?
tôi đã làm ba thí nghiệm:
Tôi đã gỡ bỏ instantiation của
Content
trong constructorParentViewModel
, sau đóContent
lànull
trong ví dụ thứ hai ở trên, nhưng xác nhận vẫn trôi qua.Tôi đã thêm một thuộc tính
[Required]
đếnContent
tài sản (nhưng không loại bỏ các instantiation củaContent
trong constructorParentViewModel
). Điều này không có tác dụng gì cả, hành vi được mô tả của hai bài kiểm tra ở trên là như nhau.Tôi đã thêm một thuộc tính
[Required]
đếnContent
tài sản và loại bỏ các instantiation củaContent
trong constructorParentViewModel
. Điều này dường như hoạt động như tôi muốn: Trong thử nghiệm thứ haiContent
lànull
và xác thực không thành công do thuộc tính[Required]
.Nó sẽ giống như thế này:public class ParentViewModel { [Required] public ChildViewModel Content { get; set, } } public class ChildViewModel { [Required] public string Name1 { get; set, } [Required] public string Name2 { get; set, } }
tôi sẽ kết luận bây giờ mà instantiating tài sản Content
con trong constructor ParentViewModel
là nguồn gốc của vấn đề và rằng mô hình chất kết dính tự phải nhanh chóng các thuộc tính con (hay không , nếu không có trường biểu mẫu phù hợp trong yêu cầu) để có xác thực hợp lệ phía máy chủ hoạt động.
Tôi có bản thuyết trình thuộc tính con ở một số nhà xây dựng mô hình chế độ xem khác và không nhận thấy vấn đề này cho đến bây giờ. Vì vậy, đây có phải là một thực tế không tốt? Có cách nào khác để giải quyết vấn đề không?
Tôi hiện đang vật lộn với điều gì đó tương tự. Chỉ có sự khác biệt trong trường hợp của tôi là, tôi có một 'IEnumerable' của ChildViewModels. Tôi đã thử tất cả ba lựa chọn ở trên và dường như không có gì làm việc cho tôi. –