2010-05-03 13 views
5

समस्या यह है: जब मैं एक पृष्ठ पर उसी प्रकार के 2 नियंत्रण डालता हूं तो मुझे बाध्यकारी के लिए अलग-अलग उपसर्ग निर्दिष्ट करने की आवश्यकता होती है। इस मामले में फॉर्म गलत होने के ठीक बाद उत्पन्न प्रमाणीकरण नियम। तो मामला ?: के लिए ग्राहक सत्यापन काम पाने के लिएएएसपी.नेट एमवीसी 2 क्लाइंटसाइड सत्यापन समस्या उपसर्गों के साथ नियंत्रण के साथ

पेज शामिल हैं:

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

नियंत्रण ViewUserControl <PhoneViewModel>:

<%= 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" रिटर्न या "फोनफोन.कंट्रीकोड" उपसर्ग


के आधार पर

और यहां फ़ॉर्म के बाद उत्पन्न सत्यापन नियम हैं। उन्हें फ़ील्ड नाम "फोन.कंट्रीकोड" के लिए डुप्लिकेट किया गया है। जबकि वांछित परिणाम 2 नियम (अपेक्षित, संख्या) FieldNames "FaxPhone.CountryCode" से प्रत्येक के लिए, "PhonePhone.CountryCode" alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

है सवाल कुछ हद तक Asp.Net MVC2 Clientside Validation and duplicate ID's problem की नकल है, लेकिन सलाह मैन्युअल आईडी नहीं करता है उत्पन्न करने के लिए मदद नहीं करता है।

उत्तर

10

दोनों पाठ बॉक्स और सत्यापन के लिए एक ही उपसर्ग सेट करने के लिए सही रास्ता:

<% 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/ पर कोड में समाधान पाया जाता है)

एचटीएमएल की तरह दिखता है। संपादक के दृष्टिकोण के साथ-साथ सुझाव दिया जाना चाहिए: ASP.NET MVC 2 - ViewModel Prefix

+0

अच्छा। यह जवाब बहुत उपयोगी था। इच्छा है कि मैं इसे दो बार ऊपर उठा सकता हूं। –

+0

बहुत, बहुत उपयोगी। धन्यवाद। – Luke

+0

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन मैं सोच रहा था कि क्या आपकी विधि इसे आपके दृश्य में डालने के लिए बेहतर है: ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; –

संबंधित मुद्दे