ASP.NET MVC, как добиться, чтобы использовать ту же модель с другим сообщением об ошибке - PullRequest
0 голосов
/ 03 июня 2011

У меня возникла эта проблема на данный момент, у меня была модель адреса (используйте для оформления обязательный атрибут), которую можно использовать несколько раз на одной странице, один - адрес для выставления счета, а другой - адрес для доставки. когда проверка не удалась, я хотел бы иметь суффикс перед моим общим сообщением об ошибке, чтобы указать, какой адрес требуется, например. «{0} - требуется адресная строка 1», выставление счета или доставка

Вот моя модель

   public class AddressBaseModel
   {                            
        [Display(Name="Address line 1")]
        [Required(ErrorMessageResourceType = typeof(ModelValidation), ErrorMessageResourceName = "AddrLine1Required")]
        public string AddressLine1 { get; set; }


        [Display(Name="Address line 2")]
        [Required(ErrorMessageResourceType = typeof(ModelValidation), ErrorMessageResourceName = "AddrLine2Required")]
        public string AddressLine2 { get; set; }

        [Display(Name="Address line 3")]
        public string AddressLine3 { get; set; }

        [Display(Name="Address line 4")]
        public string AddressLine4 { get; set; }
       }
    }

Вот сегмент кода, который я использовал на своей странице

<fieldset class="space-bottom">
     <legend>Please enter your home address</legend>
         <div id="home_fields">
             @Html.EditorFor(m => m.HomeAddress)
          </div>
 </fieldset>

  <fieldset class="space-bottom">
      <legend>Please enter your delivery address</legend>
          <div id="delivery_fields">
              @Html.EditorFor(m => m.DeliveryAddress)
          </div>
  </fieldset>

Спасибо

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Лично я использую библиотеку FluentValidation.NET вместо аннотаций данных, поскольку она значительно упрощает работу и предоставляет гораздо больше возможностей.Вот пример того, как достичь этой цели с помощью этой библиотеки.

  1. Создайте новый проект ASP.NET MVC 3 с использованием шаблона Visual Studio по умолчанию
  2. Установите пакет FluentValidation.MVC3 NuGet.
  3. Добавьте следующую строку в Application_Start:

    ModelValidatorProviders.Providers.Add(
        new FluentValidationModelValidatorProvider(
            new AttributedValidatorFactory()
        )
    );
    
  4. Определите следующие модели:

    public class AddressBaseModel
    {
        public string AddressLine1 { get; set; }
    }
    
    [Validator(typeof(MyViewModelValidator))]
    public class MyViewModel
    {
        public AddressBaseModel HomeAddress { get; set; }
        public AddressBaseModel DeliveryAddress { get; set; }
    }
    
  5. и следующие валидаторы:

    public class AddressBaseModelValidator : AbstractValidator<AddressBaseModel>
    {
        private readonly string _addressType;
    
        public AddressBaseModelValidator(string addressType)
        {
            _addressType = addressType;
            RuleFor(x => x.AddressLine1)
                .NotEmpty()
                .WithMessage(string.Format("{0} - address line 1 required", addressType));
        }
    }
    
    public class MyViewModelValidator : AbstractValidator<MyViewModel>
    {
        public MyViewModelValidator()
        {
            RuleFor(x => x.HomeAddress)
                .SetValidator(new AddressBaseModelValidator("billing"));
    
            RuleFor(x => x.DeliveryAddress)
                .SetValidator(new AddressBaseModelValidator("shipping"));
    
        }
    }
    
  6. Изменить HomeController:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel
            {
                HomeAddress = new AddressBaseModel(),
                DeliveryAddress = new AddressBaseModel()
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return View(model);
        }
    }
    
  7. И соответствующий Index.cshtml просмотр:

    @model MyViewModel
    
    @using (Html.BeginForm())
    {
        <fieldset class="space-bottom">
            <legend>Please enter your home address</legend>
            <div id="home_fields">
                @Html.EditorFor(m => m.HomeAddress)
            </div>
        </fieldset>
    
        <fieldset class="space-bottom">
            <legend>Please enter your delivery address</legend>
            <div id="delivery_fields">
                @Html.EditorFor(m => m.DeliveryAddress)
            </div>
        </fieldset>
    
        <input type="submit" value="Register" />
    }
    
0 голосов
/ 04 июня 2011

Вы можете создать пользовательский атрибут, который выполняет динамическое форматирование за вас.Вы бы просто пометили свои поля адреса атрибутом Address следующим образом:

    [Address]
    public string AddressLine1 { get; set; } 

Вам необходимо добавить свойство в AddressBaseModel, где вы сообщаете системе, какой это тип адреса (вы должны установить его на«Выставление счетов» или «Доставка», когда вы создаете экземпляр модели представления непосредственно перед передачей модели представления в представление в действии контроллера get):

public string AddressType { get; set; }

Пользовательский атрибут, подобный этому, должен работать (у меня нетЯ проверил это, я написал это только сейчас).Это автоматически возвращает тип адреса, который вы указали при создании экземпляра модели, и форматирует его с отображаемым именем поля адреса.)

public class AddressAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "{0} - {1} required";

    public AddressAttribute()
        : base(DefaultErrorMessage) { }

    protected override ValidationResult IsValid(object value,
                                            ValidationContext validationContext)
    {
        if (value != null)
        {
            if (!base.IsValid(value))
            {
                // get the property called "AddressType" from the model so we know if it's Billing or Shipping
                var addressType = validationContext.ObjectInstance.GetType()
                                                .GetProperty("AddressType")
                                                .GetValue(validationContext.ObjectInstance, null);

                // use the display name of the address field in the error message
                return new ValidationResult(
                    string.Format(DefaultErrorMessage, addressType, validationContext.DisplayName));
            }
        }

        return ValidationResult.Success;
    }
}
0 голосов
/ 03 июня 2011

Это должно работать:

 [Required(ErrorMessage = "The Address 2 is required.")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...