Объект Compound View Model, вызывающий ошибку удаленной проверки - PullRequest
8 голосов
/ 13 февраля 2011

Я использовал шаблон составных моделей для нескольких форм в этом проекте. Работает очень хорошо.

В этом случае у меня есть модель представления VendorAddress. Я использую Address (s) в нескольких местах в этом проекте, поэтому я создал объект Address Address Model, который я могу использовать повторно. Затем я решил, что хочу сделать очень тщательную проверку кодов состояния и почтовых индексов, поэтому я решил, что я попытаюсь использовать удаленную проверку и проверить состояние и почтовый индекс в сравнении с хранимым набором таблиц в базе данных.

Проблема в том, что я не возвращаю значения в методы удаленного действия для полей, которые я запрашиваю (в данном случае State и PostalCode). Я полагаю, что это из-за искажения имен, которое MVC делает для составных или подтипов для идентификаторов для входных данных, в этом случае он создает такие имена, как 'Address_Line1' и 'Address_State' и 'Address_PostalCode'.

В конечном счете, у меня возникает вопрос: есть ли способ отключить предварительно добавленный 'Address_' из объекта модели базового представления таким образом, чтобы инфраструктура MVC могла поместить его в объект после публикации формы?

    public class AddressViewModel
{
    [ScaffoldColumn(false)]
    public int AddressId { get; set; }
    [Required(ErrorMessage = "Please enter the first address line")]
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string Line3 { get; set; }
    [Required(ErrorMessage = "Please enter a city name")]
    public string City { get; set; }
    [Required(ErrorMessage = "Please enter a state 2 letter code")]
    [StringLength(2)]
    [Remote("CheckState", "Validation", AdditionalFields = "PostalCode")]
    public string State { get; set; }
    [Required(ErrorMessage = "Please enter a postal code")]
    [Remote("CheckZip", "Validation", AdditionalFields = "State")]
    [Display(Name = "Zip / Postal Code")]
    public string PostalCode { get; set; }
    public string Country { get; set; }
}

public class VendorContactViewModel
{
    public int VedorContactId { get; set; }
    public int ContactVendorId { get; set; }
    public int ContactId { get; set; }
    [Required]
    [Display(Name = "Contact Type")]
    public byte ContactTypeId { get; set; }
    public string ContactType { get; set; }
    [Required]
    [Display(Name = "Contact Info")]
    public string ContactInfo { get; set; }
    [Display(Name = "Contact Label")]
    public string ContactLabel { get; set; }
    public IEnumerable<SelectListItem> ContactTypes { get; set; }
}

тогда в форме после рендеринга это выглядит так:

    <input type="text" value="" size="2" name="Address.State" maxlength="2" id="Address_State" 
  data-val-required="Please enter a state 2 letter code" data-val-remote-url="/Validation/CheckState" 
  data-val-remote-additionalfields="*.State,*.PostalCode" data-val-remote="&amp;#39;State&amp;#39; is invalid." 
  data-val-length-max="2" data-val-length="The field State must be a string with a maximum length of 2." 
  data-val="true" class="input-validation-error">

Я получаю удаленный вызов, но в параметрах «State» и «PostalCode» ничего нет, поэтому ненавязчивые процедуры запускаются, но я думаю, что он не знает, где искать данные, даже если я что-то набрал в выделенные поля. Как вы можете видеть в отрендеренном коде id = "Address_State" и data-val-remote-Additionalfields = " .State, .PostalCode"

Спасибо за ваше время и усилия,

Irv

Ответы [ 2 ]

11 голосов
/ 13 февраля 2011

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

public ActionResult CheckState(
    [Bind(Prefix = "Address.State")]string State, 
    [Bind(Prefix = "Address.PostalCode")]string PostalCode
)
{
    ...
}
0 голосов
/ 11 сентября 2017

Я столкнулся с этой проблемой, но мне нужно было использовать одну и ту же ViewModel в нескольких представлениях с разными префиксами.В итоге я написал javascript, который изменил правила удаленной проверки jQuery, чтобы они не включали префикс:

$('[data-val-remote]').each(function () {
    // overwrite the remote rule data so that it sends non-prefixed property name to the server
    var remoteRule = $(this).rules().remote;
    var newData = {};
    var keys = Object.keys(remoteRule.data);
    for (var i = 0; i < keys.length; i++) {
        var nonPrefixedPropertyName = $(keys[i].split('.')).last()[0];
        newData[nonPrefixedPropertyName] = remoteRule.data[keys[i]];
    }
    remoteRule.data = newData;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...