2011-12-20 25 views
13

Tôi có quy trình tạo hai bước khi tập dữ liệu đầu tiên được lưu trữ trong phiên.ASP.NET MVC TryValidateModel() Các vấn đề khi Mô hình được sửa đổi

[IsMp4File] 
[Required(ErrorMessage = "* Please select a video to upload")] 
public HttpPostedFileBase VideoClip { get; set; } 

[Required(ErrorMessage = "* Please select a thumbmail image")] 
public HttpPostedFileBase VideoThumbnail{ get; set; } 

public string VideoFileName { get { return VideoClip.FileName; } } 

public NewsWizardStep CurrentStep { get; set; } 

...

public enum NewsWizardStep : int 
{ 
    One = 1, 
    Two = 2, 
    Three = 3, 
    Four = 4, 
    Five = 5, 
    Six = 6 
} 

khiển

public ActionResult TvCreate(TvNewsVideoVM modelVM) 
{ 
    if (modelVM.CurrentStep == NewsWizardStep.Two) 
    { 
    var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]); 

    modelVM.VideoClip = sessionModel.VideoClip; 
    modelVM.VideoThumbnail = sessionModel.VideoThumbnail; 
    } 

    if (TryValidateModel(modelVM)) 
    { 
    ... 
    } 
} 

TryValidateModel(modelVM) lợi nhuận sai sự thật, nói VideoClip và VideoThumnail được yêu cầu, mặc dù lập bản đồ chúng từ seesionModel đến ViewModel. Tôi đã thêm một điểm ngắt và kiểm tra chúng không phải là null.

Có vẻ như có một số chức năng cơ bản mà tôi không biết về cách ModelState và ValidateModel() hoạt động, tôi chỉ không biết điều gì.

CẬP NHẬT

Tôi sẽ không nói rằng tôi đã giải quyết vấn đề này nhưng đã tìm ra một cách giải quyết mà không phải là khá, Bằng cách đi vào ModelState nó có thể thiết lập các ModelValue sử dụng SetModelValue() sau đó tự loại bỏ lỗi từ trạng thái mô hình và sau đó gọi TryValidateModel() - bạn thậm chí có thể không phải thêm các giá trị vừa xóa lỗi mà tôi chưa thử. Đây là công việc của tôi xung quanh.

if (modelVM.CurrentStep == NewsWizardStep.Two) 
{ 
    var sessionModel = ((MtTvNewsVideoVM)Session["MtTvModelVM"]); 

    modelVM.VideoClip = sessionModel.VideoClip; 
    modelVM.VideoThumbnail = sessionModel.VideoThumbnail; 

    ModelState.SetModelValue("VideoClip", new ValueProviderResult(sessionModel.VideoThumbnail, sessionModel.VideoFileName, CultureInfo.CurrentCulture)); 
       ModelState.SetModelValue("VideoThumbnail", new ValueProviderResult(sessionModel.VideoClip, sessionModel.VideoFileName, CultureInfo.CurrentCulture)); 

    ModelState["VideoClip"].Errors.RemoveAt(0); 
    ModelState["VideoThumbnail"].Errors.RemoveAt(0); 
} 

Trả lời

20

Trong mô hình ràng buộc DefaultModelBinder xác thực thông số hành động của bạn. Vì vậy, khi thực thi chạm vào phương thức public ActionResult TvCreate(TvNewsVideoVM modelVM) của bạn, ModelState đã chứa các lỗi xác thực.
Khi bạn gọi TryValidateModelkhông xóa số ModelState để các lỗi xác thực vẫn còn đó là lý do tại sao nó trả về false. Vì vậy, bạn cần phải xóa bộ sưu tập ModelState nếu bạn muốn làm lại xác nhận sau tay:

public ActionResult TvCreate(TvNewsVideoVM modelVM) 
{ 
    ModelState.Clear(); 

    if (modelVM.CurrentStep == NewsWizardStep.Two) 
    { 
    var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]); 

    modelVM.VideoClip = sessionModel.VideoClip; 
    modelVM.VideoThumbnail = sessionModel.VideoThumbnail; 
    } 

    if (TryValidateModel(modelVM)) 
    { 
    ... 
    } 
} 
+0

Thats tốt hơn nhờ - Tôi không hiểu tại sao() phương pháp TryValidateModel không gọi Clear() Phương pháp đầu tiên và sau đó cố gắng xác thực Mô hình. – SimonGates

+2

nếu bạn chỉ quan tâm đến việc xác thực thủ công, bạn có thể bỏ qua ma thuật xác nhận ban đầu bằng cách trang trí phương thức Bộ điều khiển với bkwdesign

Các vấn đề liên quan