在视图中对多个模型进行不同的验证

时间:2011-06-10 11:22:57

标签: 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; }
}

我有一个视图,显示两个模型的编辑器以及输出BookingFlight中包含的FlightPassengers列表的webgrid,类似于:

@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>
}

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

那么只验证视图模型部分的最佳方法是什么?或者我是否会以错误的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您使用的是单一视图模型类,则可以实现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
    }
}

因此,如果返回的IEnumerable<ValidationResult>有.Count&gt; 0,那么视图模型将不会验证。

请注意,如果您在视图中使用了验证消息,我认为您可能需要验证摘要以添加yield'ed ValidationResult