Asp.net mvc 视图中多个模型的不同验证

Asp.net mvc 视图中多个模型的不同验证,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,如果我的视图模型看起来像这样: public class FlightViewModel { public BookingFlight BookingFlight { get; set; } // contains list of FlightPassengers public FlightPassenger AddedPassenger { get; set; } } 我有一个视图,显示两个模型的编辑器以及一个webgrid,输出BookingFlight中包含的航班

如果我的视图模型看起来像这样:

    public class FlightViewModel {
    public BookingFlight BookingFlight { get; set; } // contains list of FlightPassengers
    public FlightPassenger AddedPassenger { get; set; }
}
我有一个视图,显示两个模型的编辑器以及一个webgrid,输出BookingFlight中包含的航班乘客列表,类似于以下内容:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
        <legend>Flight Booking</legend>
        @Html.Partial("_CreateOrEditBookingFlight")
        @Html.Partial("_CreateOrEditPassenger")
        @grid.GetHtml()
        <p>
            <button name="button" value="addPassenger">Add New Passenger</button>
            <button name="button" value="submitBooking">Submit Booking</button>
        </p>
}
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
机票预订
@Html.Partial(“\u CreateOrEditBookingFlight”)
@Html.Partial(“\u CreateOrEditPassenger”)
@grid.GetHtml()

增加新乘客
提交预订

}
我的问题是:这两个按钮都需要正确验证BookingFlight和FlightPassenger部件。在理想情况下,用户可以在没有任何航班信息的情况下添加有效的乘客


那么,仅验证viewmodel的一部分的最佳方法是什么?还是我的做法完全错了?

如果使用单个视图模型类,可以实现
IValidatableObject
及其
Validate
方法

public class FlightViewModel : IValidatableObject {
    public BookingFlight bookingFlight { get; set; } // contains list of FlightPassengers
    public FlightPassenger addedPassenger { get; set; }

    public IEnumerable<ValidationResult> Validate(
        ValidationContext validationContext) {

        // .IsValid properties are made up
        if (!bookingFlight.IsValid && !addedPassenger.IsValid)
            yield return new ValidationResult("Something blew up", new string[] { "addedPassenger", "bookingFlight" });

        // implement other validation and yield additional
        // ValidationResult's as needed
    }
}
公共类FlightViewModel:IValidatableObject{
公共预订航班预订航班{get;set;}//包含航班乘客列表
公共航班乘客附加乘客{get;set;}
公共IEnumerable验证(
ValidationContext(验证上下文){
//.IsValid属性是由
如果(!bookingFlight.IsValid&!addedPassenger.IsValid)
返回新的ValidationResult(“有东西爆炸了”,新字符串[]{“addedPassenger”,“bookingFlight”});
//实施其他验证并产生额外的
//根据需要验证结果
}
}
因此,如果
IEnumerable
返回的.Count>0,则视图模型将不会验证

请记住,如果您在视图中使用验证消息,我认为您可能需要添加任何
yield
'ed
ValidationResult
的验证摘要