Проверка не работает, когда в представлении существует два экземпляра пользовательского контроля - PullRequest
1 голос
/ 17 августа 2010

Я создал пользовательский элемент управления Address, который выглядит следующим образом:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Address>" %>

   <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Type") %>">
        <%: GetLocalResourceObject("Type")%>
   </div>
   <div class="span-6 last">
       <%: Html.RadioButtonFor(model => model.AddressType, RealProperty.Core.Domain.AddressType.Postal, new { id = ViewData["AddressPrefix"] + "AddressType" })%>
    &nbsp;
       <%: GetLocalResourceObject("PostalType")%>
       <%: Html.RadioButtonFor(model => model.AddressType, RealProperty.Core.Domain.AddressType.Intersection, new { id = ViewData["AddressPrefix"] + "AddressType" })%>
    &nbsp;
       <%: GetLocalResourceObject("IntersectionType")%>
    </div>
    <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Country") %>">
      <%: GetLocalResourceObject("Country")%>
    </div>
    <div class="span-6 last">
    <%: Html.DropDownList(ViewData["AddressPrefix"] + "Country", new SelectList(RealProperty.Core.Service.CountryService.Countries, "Id", "Name"), "Please select Country", new { id = ViewData["AddressPrefix"] + "Country" })%>
        <%: Html.ValidationMessage(ViewData["AddressPrefix"] + "Country")%>
    </div>
    <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Address1") %>">
       <%: GetLocalResourceObject("Address1")%>
    </div>

 .
 .
 .
 .

Я буду использовать два экземпляра этого пользовательского элемента управления на странице для «Основной адрес» и «Альтернативный адрес»:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PhysicalLocation>" %>

   <div class="span-12">
        <fieldset>
            <legend>Main Address</legend>
            <%
                Html.RenderPartial("~/Views/Address/New.ascx", Model.MainAddress);
            %>
        </fieldset>
    </div>
    <div class="span-12 last">
        <fieldset>
            <legend>Alternate Address</legend>
            <%
                Html.RenderPartial("~/Views/Address/New.ascx", Model.AlternateAddress);
            %>
        </fieldset>
    </div>

Управление адресом пользователя привязано к модели «Адрес».

 [PostalCode("PostalCode", "Country", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "PostalCode_Is_Invalid"), DisplayName("Address") ]
    public class Address : ICanBeValidated
    {

        public virtual long Id { get; set; }

        [RegularExpression("^[^,'\"]*$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidCharacter"),
    Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Required"), StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")]
        public virtual string Address1 { get; set; }

        [RegularExpression("^[^,'\"]*$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidCharacter"),
    StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")]
        public virtual string Address2 { get; set; }

        [RegularExpression("^([a-zA-Z\\.\\-\\s]*)$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ValidCharacter_Allowed")]
        [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Required"), StringLength(30, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")]
        public virtual string City { get; set; }
    .
    .
    .
 }

Я ожидаю, что при рендеринге он создает два разных набора элементов управления вводом для MainAddress и AlternateAddress (т.е. исходя из опыта веб-формы).

Я предполагаю, что мне не хватаеточень базовый момент здесь, поскольку, когда отображаются оба пользовательских элемента управления, на странице у меня есть два "города", "адрес1", "адрес2" и т. д.

И в результате Microsoft Validation работает только для одногоиз пользовательских элементов управления.Массив JSON, отправляемый клиенту, содержит проверку только для одного из них, основываясь на определении модели.Например, для свойства «City» адреса у нас есть только одна запись в упомянутом массиве, и в результате существует только элемент «span» с идентификатором «City_ValidateMessage», связанным с проверкой.

Я ценю любые мысли.

Спасибо, Мухаммед

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

Решение, которое я нашел в блоге Стива Сандерсона - это взлом HttpContext для генерации уникальных идентификаторов при визуализации пользовательского элемента управления. Это хорошо решает проблему с проверкой.

0 голосов
/ 17 августа 2010

Если вы используете 2 экземпляра на странице, имеет ли ваша модель 2 набора свойств для хранения адреса?

Ваша модель должна быть:

Class DoubleAddressViewModel()
    <PropertiesForAddressMain>
    <PropertiesForAddressAlternate>
End Class

Из ваших комментариеввыше, я думаю, у вас есть модель, которая представляет один адрес

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...