6

私は2つのビューモデルをコントローラに投稿するページを持っています.InquiryとAppointmentです。予定は問い合わせ内にネストされています。ユーザーは、予約を作成せずに、当社に問い合わせを送信することを選択できます。

ビュー モデルのプロパティで組み込みの MVC 必須属性を使用します。

私の質問は、ユーザーが予約なしで問い合わせを作成することを選択した場合、ネストされた Appointment ビュー モデルのバリデーターをエレガントに無視し、ModelState.IsValid が true を返すようにするにはどうすればよいですか?

if(!viewModel.CreateAppointment)
            {
                //ignore the nested view models validation                            
            }
4

4 に答える 4

3

まあ、標準データ属性を使用するときにエラーを「エレガントに」無視する方法はありません。

ただし、いくつかのオプションがあります。手っ取り早い (つまり洗練されていない) 方法は、コントローラーの ModelState から関連するエラーをクリアすることです。

if (some condition) {
    ModelState["controlName"].Errors.Clear();
}

条件付きテストを使用する独自のカスタム データ属性を作成することもできます。ここで説明されているようなもの:

http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

3 つ目のアプローチは、属性を避け、 FluentValidationなどの検証フレームワークを使用することです。

最後のオプションは、JavaScript を使用してデータの正しい状態を判断し、フォームのアクション URL を変更して別のアクション メソッドに投稿することです。次に、アクション メソッドのパラメーターを Bind 属性で修飾して、不要なデータ項目を除外できます。ただし、クライアントがサーバー側の検証プロセスに関与する必要があるため、これはお勧めしません。

于 2012-10-03T17:14:48.917 に答える
2

これが私がやったことです。

これにより、ネストされた Appointments ViewModel のすべてのエラーをクリアできました。

if (!viewModel.CreateAppointment)
            {
                foreach (var modelError in ModelState)
                {
                    string propertyName = modelError.Key;

                    if (propertyName.Contains("AppointmentsViewModel"))
                    {
                        ModelState[propertyName].Errors.Clear();
                    }
                }
            }
于 2012-10-05T09:49:07.590 に答える
0

もう 1 つのオプションは、Inquiry 内に Appointment をネストする代わりに、Appointment モデルと Inquiry モデルの両方を別々に含むページの ViewModel を作成し、Bind 属性を Property Include または Exclude と共に使用して、以下に示すようにバインドまたは除外するモデルを選択的に選択することです。 .

    Public Class EnquiryViewModel
    {
        public Appointment App {get; set;}
        public Enquiry Enq {get; set; }
    } 

    [HttpPost]
    //Only bind Enquiry model and it's errors.
    public ActionResult CreateEnquiryOnly([Bind(Include = "Enq")]EnquiryViewModel enquiry)
    {
        if(ModelState.IsValid)
        {
        // Code for enquiry only.
        }
    }
于 2014-08-19T21:11:14.250 に答える