سؤال

المشكلة هي: عندما أضع عناصر تحكم من نفس النوع على صفحة ، أحتاج إلى تحديد بادئات مختلفة للربط. في هذه الحالة ، تكون قواعد التحقق التي تم إنشاؤها مباشرة بعد النموذج غير صحيحة. إذن كيف تحصل على عمل التحقق من صحة العميل للقضية؟:

تحتوي الصفحة على:

<%
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" });
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" });
%>

التحكم في العرضu003CPhoneViewModel> :

<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %>
<%= Html.ValidationMessage("Phone.CountryCode", new { id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") })%>

أين Model.GetPrefixed("CountryCode") فقط إرجاع "Faxphone.countryCode" أو "Phonephone.countryCode" اعتمادًا على البادئة


وهنا قواعد التحقق التي تم إنشاؤها بعد النموذج. يتم تكرارها لاسم الحقل "phone.countrycode". على الرغم من أن النتيجة المرجوة هي قاعدتين (مطلوبون ، الرقم) لكل من الأسماء الميدانية "Faxphone.countryCode" ، "Phonephone.countryCode"alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

السؤال مكرر إلى حد ما ASP.NET MVC2 Clientside التحقق من صحة ومشكلة معرف مكررلكن تقديم المشورة لتوليد معرفات يدويًا لا يساعد.

هل كانت مفيدة؟

المحلول

الطريقة الصحيحة لتعيين نفس البادئات لكل من مربع النص والتحقق من الصحة:

<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
   <%= Html.TextBoxFor(m => m.Address.PostCode) %>
   <%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<% } %>

أين

public static class HtmlPrefixScopeExtensions
{
    public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    {
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    }

    private class HtmlFieldPrefixScope : IDisposable
    {
        private readonly TemplateInfo templateInfo;
        private readonly string previousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            this.templateInfo = templateInfo;

            previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
        }
    }
}

(عن طريق الصدفة ، وجدت الحل في الكود على مدونة ستيف ساندرسون http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/)

يبدو أيضًا أن نهج HTML.Editorfor يجب أن يعمل وكذلك المقترح هنا: ASP.NET MVC 2 - VINEMODEL بادئة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top