Я использовал шаблон составных моделей для нескольких форм в этом проекте. Работает очень хорошо.
В этом случае у меня есть модель представления 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="&#39;State&#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