0

を実装するクラスを作成しましたIModelBinder(以下を参照)。このクラスは、それぞれが日付値の一部 (日、月、年) を表す 3 つの入力を持つフォームを処理します。HtmlHelperまた、フォームに 3 つのフィールドを出力するための対応する拡張メソッドも作成しました。

日、月、年の入力に解析可能な値が与えられたが、別の値が検証に失敗した場合、すべて問題ありません。フィールドが再入力され、期待どおりにページがユーザーに提供されます。

ただし、無効な値が指定さDateTimeれ、解析できないDateTime場合は、ユーザーに返されるときにフィールドが再設定されるように任意の値を返します。

私は人々が抱えていた同様の問題について読みましたが、それらはすべて電話の欠如が原因のようSetModelValue()でした. 私はこれを行っていませんでしたが、問題を追加しても解決されていません。

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
   string modelName = bindingContext.ModelName;
   string monthKey = modelName + ".Month";
   string dayKey = modelName + ".Day";
   string yearKey = modelName + ".Year";

   //get values submitted on form
   string year = bindingContext.ValueProvider[yearKey].AttemptedValue;
   string month = bindingContext.ValueProvider[monthKey].AttemptedValue;
   string day = bindingContext.ValueProvider[dayKey].AttemptedValue;

   DateTime parsedDate;
   if (DateTime.TryParse(string.Format(DateFormat, year, month, day), out parsedDate))
        return parsedDate;

   //could not parse date time report error, return current date
   bindingContext.ModelState.AddModelError(yearKey, ValidationErrorMessages.DateInvalid);

   //added this after reading similar problems, does not fix!
   bindingContext.ModelState.SetModelValue(yearKey, bindingContext.ValueProvider[modelName]);
   return DateTime.Today;
}

日付の Year プロパティのテキストボックスを作成しようとすると、null 参照例外がスローされますが、不思議なことに、Day または Month ではありません!

これがなぜなのか説明できる人はいますか?

4

1 に答える 1

0

これで修正されるはずです:

bindingContext.ModelState.AddModelError(
    yearKey, 
    ValidationErrorMessages.DateInvalid
);

bindingContext.ModelState.SetModelValue(
    yearKey, 
    bindingContext.ValueProvider[modelName]
);

同じキーを使用する必要があることに注意してください ( yearKey)。

于 2010-06-17T15:14:41.183 に答える