公開した asp.net MVC4 ソリューションに奇妙な問題があります。これまでのところ、検証に関してはすべてうまくいっています。次に、公開されたIISTESTサーバーでのみ問題が発生します(VS2012を介してローカルで問題なく、「デバッグなしで開始」してもバンドルがアクティブになります)。
どうしたの?2つか3つのことに気がつきましたが、最初のものについて話しましょう。
さまざまなテキストボックス、オプションなどでクライアント側の検証を行っています...そのうちの1つは、公開されたサーバーで検証を管理しなくなりました。それを確認するには、ページに移動して F12 を押し、テキスト ボックスをクリックして html をコピーします。
これがローカルバージョンです(VS2012で実行):
<input name="EmergencyReason" class="input-validation-error" id="EmergencyReason" type="text" data-val="true" hideRow="true" data-val-requiredifloadingtoday="Le champ {0} n'est pas valide." value=""/>
ご覧のとおり、いくつかの検証があります。
公開されたバージョンは次のとおりです。
<input name="EmergencyReason" id="EmergencyReason" type="text" jQuery17205969379292482464="55" hiderow="true"/>
もう検証はありません。しかし、私のテキストボックスには検証があるものとないものがあります。
入力検証エラーの代わりに jQuery17205969379292482464 という検証が機能しないテキストボックスがあることにいつも気付きました... スクリプトと CSS のこのソリューションをバンドルしています。たぶん、理解するのに役立つかもしれません。
何か案が?私は半日以来この問題に取り組んでいるので、どんな助けも大歓迎です。
ありがとう。
アップデート - - - - - - - - - - - -
ローカルでいくつかのテストを行い、F12 /「ブラウザモード」を操作した後 >> IE7 jQuery17205969379292482464 がローカルおよびサーバーに表示されるため、これは私の問題とは関係ありません。1 つ確かなことは、[Required] 属性のようないくつかの基本的なクライアント検証が機能することです。もう働いていない人の検証は次のとおりです。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class RequiredIfLoadingTodayAttribute : ValidationAttribute, IClientValidatable
{
public RequiredIfLoadingTodayAttribute() { }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
///////////////
// IsLoading //
///////////////
var propertyIsLoadingInfo = validationContext.ObjectType.GetProperty("IsLoading");
var propertyIsLoadingValue = propertyIsLoadingInfo.GetValue(validationContext.ObjectInstance, null);
//////////
// Date //
//////////
var propertyDateInfo = validationContext.ObjectType.GetProperty("Date");
var propertyDateValue = propertyDateInfo.GetValue(validationContext.ObjectInstance, null);
////////////////
// Validation //
////////////////
Boolean isLoading = Convert.ToBoolean(propertyIsLoadingValue);
DateTime dateLoading = Convert.ToDateTime(propertyDateValue);
DateTime dateToday = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
// Validation uniquement pour le chargement
if (isLoading)
{
// Si la date de chargement = date du jour et on a pas de raison indiquée -> déclencher une erreur de validation
if ((DateTime.Compare(dateLoading, dateToday)==0) && (value==null))
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule {
ErrorMessage = this.ErrorMessageString,
ValidationType = "requiredifloadingtoday"
};
yield return rule;
}
}
関連する js ファイル:
$.validator.unobtrusive.adapters.add(
'requiredifloadingtoday', '', function (options) {
options.rules['requiredifloadingtoday'] = options.params;
options.message['requiredifloadingtoday'] = options.message;
});
$.validator.addMethod('requiredifloadingtoday', function (value, element, params) {
// Cette validation côté client n'est utilisée que sur le tab chargement
// pour s'assurer qu'une raison est indiquée dans le cas ou la date
// de chargement est le jour même.
return (($Date.val() == DateToday) && (value != ''))
}, '');
そしてviewModel:
[RequiredIfLoadingToday()]
public string EmergencyReason { get; set; }
そしてビュー:
<script type="text/javascript" src="@Url.Content("~/Scripts/Loading/When.js")"></script>
<span class="editor-field">
@Html.TextBoxFor(m => m.EmergencyReason, Model.Date != DateTime.Today ? new {hideRow="true"} : null)
</span>
...
この少し「高度な」検証のどこに問題があるのか わかりません。アヤックスの問題?