اعتبارسنجی شرطی فرم‌ها در MVC
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

در پروژه‌ای که در حال حاضر روی آن کار می‌کنم برای برخی موجودیت‌ها، فرم‌های ایجاد و ویرایش را یکی در نظر گرفتم و به تبع آن از ویوو مدل یکسانی هم برای این ویوو استفاده کرده‌ام. اما مشکلی که وجود داشت این بود که برخی از فیلدها در حالت ویرایش در فرم نمایش داده نمیشد. درواقع در حالتی که ویوی مذکور در حالت ویرایش باز میشد چنین شرطی داشتم:
@if (!Model.Id.HasValue)
{
    <div class="form-group">
        <label>رمز عبور</label>
        @Html.BootstrapEditorLtrFor(x => x.Password)
        @Html.ValidationMessageFor(x => x.Password)
    </div>
}
ویومدل هم به شکل زیر بود:
public class AddOrEditUserViewModel
{
    ...

    [Required(ErrorMessage = "رمز عبور را وارد کنید")]
    [MinLength(6, ErrorMessage = "حداقل 6 کاراکتر")]
    public string Password { get; set; }

    ...
}

بنابراین هنگامی که فرم در حالت ویرایش، ارسال می‌شد، در کنترلر اجازه عبور از ModelState.IsValid داده نمی‌شد. پس نیاز بود که به ModelState بگویم که وقتی در حالت ویرایش هستیم، به اعتبارسنجی‌های موجود در ویومدل که مربوط به پراپرتی Password بود توجه نکن. نحوه انجام این کار به شکل زیر بود:
if (model.Id.HasValue)
{
    ModelState["Password"].Errors.Clear();
}


if (ModelState.IsValid)
{
    ...
}
فقط کافیست قبل از ModelState.IsValid خطاهای مربوط به پراپرتی Password را از ModelState حذف کنیم.
  • #
    ‫۵ سال و ۷ ماه قبل، دوشنبه ۱ بهمن ۱۳۹۷، ساعت ۰۰:۰۵
    سلام من از روش شما استفاده کردم . در این حالت ارور‌ها رو پاک میکنه اما validationState هچنان false میمونه و باعث میشه که modelstate.isvalid همچنان false باشه و جواب درست رو نده.من این تست رو برای یک فیلد int? انجام دادم.
    • #
      ‫۵ سال و ۷ ماه قبل، سه‌شنبه ۲ بهمن ۱۳۹۷، ساعت ۱۱:۰۴
      سلام، شاید مشکل از سایر پراپرتی‌ها باشه که ولید نیستند. بریک پوینت بذارید و ModelState رو بررسی کنید ببینید کدوم پراپرتی‌ها مشکل ولیدیشن دارن.