Tôi gặp một số khó khăn khi chứng minh biểu mẫu yêu cầu của mình nên nó chỉ gửi thông tin hợp lệ và cho người dùng biết điều gì sai nếu không đúng.
Tôi muốn các thuộc tính mới do Bộ điều khiển tạo (thuộc tính cho liên hệ mới) được xác thực là sai bởi JS không phô trương khi gửi lại biểu mẫu.
quan trọng-Đây là sử dụng Bắt đầuBộ sưu tậpMục
Thêm và xóa Liên hệ
đối tượng từ tài sản cmp.contacts (Danh sách)
một cách năng động.
Các thuộc tính này là bắt buộc nhưng có thể bị xóa khỏi biểu mẫu. Sau khi gửi, Bộ điều khiển sẽ kiểm tra chúng và nếu không có, hãy thêm chúng trở lại biểu mẫu.
Chúng không hợp lệ về mặt kỹ thuật do các thuộc tính vừa được thêm vào.
Cập nhật - điều tra thêm
Tuy nhiên, điều này có vẻ kỳ lạ vì tôi có "" làm giá trị chuỗi không hợp lệ vì độ dài ký tự được đặt trong mô hình ít nhất là 3. Vì vậy, trong Bộ điều khiển ở phần đăng lại, tôi kiểm tra xem danh sách có trống không (nếu người dùng đã xóa nó) và tạo một danh sách mới với các liên hệ mới rồi chuyển ModelState.IsValid
Đã kiểm tra, nó đã vượt qua. Thuộc tính của liên hệ là các giá trị chuỗi của "", đáng lẽ không hợp lệ, nhưng chúng không được đánh dấu là không hợp lệ cho đến lần đăng lại thứ hai, tại sao vậy?
Câu chuyện ví dụ:
Người dùng xóa danh sách liên hệ khỏi trang (bạn có thể có nhiều hơn 1 liên hệ), gửi biểu mẫu và biểu mẫu không thành công vì nó yêu cầu ít nhất một liên hệ. Bộ điều khiển tạo một liên hệ mới và gửi biểu mẫu trở lại biểu mẫu. Các thuộc tính liên hệ được hiển thị trên trang, nhưng vì chúng mới được tạo nên chúng không hợp lệ.
Nếu người dùng cố gắng gửi lại, chúng sẽ bị đánh dấu là không hợp lệ, nhưng tôi muốn người dùng cần điền những gì thật rõ ràng.
Tôi có thể đặt chúng thành không hợp lệ khi đăng lại không?
Chế độ xem một phần với các trường câu hỏi:
@model Liên hệ
@using (HtmlHelpers.BeginCollectionItem.HtmlPrefixScopeExtensions.BeginCollectionItem(Html, "danh bạ"))
{
@Html.TextBoxFor(m => m.name)
@Html.TextBoxFor(m => m.telphone)
@Html.TextBoxFor(m => m.email)
@Html.DropDownListFor(m => m.type, Danh sách mới
{
new SelectListItem { Text = "Admin", Value = "Admin" },
SelectListItem mới { Text = "Peer", Value = "Peer" },
SelectListItem mới { Text = "Kỹ thuật", Giá trị = "Kỹ thuật" }
})

}
Bộ điều khiển
công khai ActionResult Tạo()
{
var cmp = Công ty mới
{
liên hệ = Danh sách mới
{
Liên hệ mới { email = "", tên = "", điện thoại = "", type = "" }
}
};
trả về Chế độ xem (cmp);
}
[Xác thựcAntiForgeryToken]
Tạo kết quả hành động công khai (Cmp công ty)
{
nếu (ModelState.IsValid)
{
db.companys.Add(cmp);
db.SaveChanges();
EmailSupport.SendEmail(cmp, "Mẫu yêu cầu");
return RedirectToAction("Thankyou", "Home");
}
nếu (cmp.contacts == null)
cmp.contacts = Danh sách mới
{
new Liên hệ { email = "", name = "",phone = "" } // bắt buộc phải hiển thị hàng thuộc tính này
};
trả về Chế độ xem (cmp);
}
người mẫu
[Bảng("Công ty")]
lớp công tyCông ty
{
[Chìa khóa]
public int companyId { được đặt;
[Bắt buộc(ErrorMessage="Yêu cầu tên công ty.")]
tên chuỗi công khai { được đặt;
[Bắt buộc(ErrorMessage = "Yêu cầu điện thoại.")]
đường dây điện thoại công cộng {được đặt;
[Bắt buộc(ErrorMessage="Yêu cầu số đăng ký.")]
chuỗi công khai Số đăng ký { get;
[Đảm bảoOneItem]
Danh sách công khai địa chỉ liên hệ { get;
}
[Bảng("Liên hệ")]
lớp công khai Liên hệ
{
[Chìa khóa]
public int contactId { được đặt;
public int companyId { được đặt;
[ForeignKey("companyId")]
công ty đại chúng {được đặt;
[Bắt buộc(ErrorMessage="Yêu cầu tên liên hệ.")]
tên chuỗi công khai { được đặt;
[Bắt buộc(ErrorMessage="Cần có điện thoại.")]
đường dây điện thoại công cộng {được đặt;
[Required]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
ErrorMessage = "Email không hợp lệ.")]
email chuỗi công khai { được đặt;
[Bắt buộc(ErrorMessage = "Yêu cầu loại liên hệ.")]
loại chuỗi công khai { được đặt;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!