2010-03-18 23 views
12

मैं अलग-अलग मॉडलों के साथ अपने विचार में दो बार रेंडरपार्टियल का उपयोग करना चाहता हूं। समस्या यह है कि कुछ गुण दोनों मॉडल (उपनाम, पासवर्ड) में मौजूद हैं। उनके पास कोई उपसर्ग नहीं है, इसलिए आईडी या नाम भी आउटपुट में बराबर हैं। अब, अगर मेरे पास उपनाम या पासवर्ड के लिए मॉडल त्रुटियां हैं, तो दोनों फ़ील्ड हाइलाइट हो जाएंगे।एएसपी.नेट एमवीसी 2 - व्यूमोडेल उपसर्ग

मुख्य दृश्य:

<div> 
    <% Html.RenderPartial("Register", Model.RegisterModel); %> 
</div> 
<div> 
    <% Html.RenderPartial("Login", Model.LoginModel); %> 
</div> 

लॉग इन PartialView:

<% using (Html.BeginForm("Login", "Member")) { %> 
<fieldset> 
    <legend>Login</legend> 
    <p> 
     <%= Html.LabelFor(x => x.Nickname) %> 
     <%= Html.TextBoxFor(x => x.Nickname) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.Password) %> 
     <%= Html.PasswordFor(x => x.Password) %> 
    </p>  
    <input type="submit" value="Login" /> 
</fieldset> 
<% } %> 

रजिस्टर PartialView:

<% using (Html.BeginForm("Register", "Member")) { %> 
<fieldset> 
    <legend>Register</legend> 
    <p> 
     <%= Html.LabelFor(x => x.Nickname) %> 
     <%= Html.TextBoxFor(x => x.Nickname) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.Email) %> 
     <%= Html.TextBoxFor(x => x.Email) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.Password) %> 
     <%= Html.PasswordFor(x => x.Password) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.PasswordRepeat) %> 
     <%= Html.PasswordFor(x => x.PasswordRepeat) %> 
    </p> 
    <input type="submit" value="Register" /> 
</fieldset> 
<% } %> 

मैं कैसे बदल सकते हैं?

उत्तर

8

Html.RenderPartial का उपयोग करने के बजाय आप editor templates का उपयोग कर सकते हैं जो उपसर्गों को संभाल लेंगे।

आपका मुख्य ध्यान में रखते हुए

तो:

<div> 
    <%-- See below what does the second argument mean --%> 
    <%= Html.EditorFor(x => x.RegisterModel, "RegisterModel") %> 
</div> 
<div> 
    <%= Html.EditorFor(x => x.LoginModel, "LoginModel") %> 
</div> 

और फिर एक फ़ोल्डर Views/Shared/EditorTemplates/RegisterModel.ascx तैयार करें (फ़ाइल का नाम EditorFor सहायक विधि में प्रयोग किया जाता है)। यह भी ध्यान दें कि यह आंशिक दृढ़ता से RegisterModel संपत्ति के प्रकार के लिखे जाने चाहिए:

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

<% using (Html.BeginForm("Register", "Member")) { %> 
<fieldset> 
    <legend>Register</legend> 
    <p> 
     <%= Html.LabelFor(x => x.Nickname) %> 
     <%= Html.TextBoxFor(x => x.Nickname) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.Email) %> 
     <%= Html.TextBoxFor(x => x.Email) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.Password) %> 
     <%= Html.PasswordFor(x => x.Password) %> 
    </p> 
    <p> 
     <%= Html.LabelFor(x => x.PasswordRepeat) %> 
     <%= Html.PasswordFor(x => x.PasswordRepeat) %> 
    </p> 
    <input type="submit" value="Register" /> 
</fieldset> 
<% } %> 

आप Views/Shared/EditorTemplates/LoginModel.ascx

0

ऐसा लगता है कि TextBoxFor के लिए एक अधिभार है जो आपको अतिरिक्त HTML विशेषताओं को निर्दिष्ट करने की अनुमति देता है। यह एक आदर्श समाधान नहीं है, लेकिन इसे आपको प्रस्तुत टेक्स्टबॉक्स के आईडी (और संभवतः नाम?) को बदलने देना चाहिए। जब आप फॉर्म पोस्ट करने का प्रयास करते हैं तो निश्चित रूप से नाम बदलना चीजों को पेंच कर देगा।

0

सबसे पहले, आप Html.TextBox("input form name", ...) का उपयोग कर सकते हैं और जो भी चाहें उसका नाम सेट कर सकते हैं। एक बड़ा मुद्दा है कि आप Html.RenderPartial() स्तर पर उपसर्ग कैसे प्रदान करेंगे? आप पहले ही एक मॉडल उदाहरण प्रदान कर रहे हैं। तो उनके दृश्य मॉडल को बदलने के बिना, केवल एक और संभावना है: RenderPartial() के लिए अपना खुद का अधिभार लिखना जो उपसर्ग लेगा और इसे दूसरों को पास करेगा।

इसे देखें। किसी ने ओवरलोड के पूरे समूह को लिखा है जो सेटिंग उपसर्ग का समर्थन करता है। TextBoxFor rendering to HTML with prefix on the ID attribute

यदि कोई गुम है तो आप पैटर्न को देख सकते हैं कि इन अतिरिक्त सुविधाओं के साथ इन्हें कैसे विस्तारित किया जाए।

+1

आपको रेंडरपार्टियल के लिए अपना खुद का अधिभार लिखने की आवश्यकता नहीं है, पहले से ही एक अधिभार है जो आपको व्यूडेटा संग्रह को फिर से परिभाषित करने देता है। आप बस वहां अपना उपसर्ग जोड़ सकते हैं और अपना मॉडल इसके लिए देख सकते हैं। देखें: http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

में लॉगिन मॉडल के लिए एक अलग आंशिक निर्धारित कर सकते हैं कि आप कुछ के लिए एक EditorTemplate नहीं कर सकते हैं कारण, आप इसे अपने दृश्य में कर सकते हैं:

var dataDict = new ViewDataDictionary(); 
dataDict.TemplateInfo.HtmlFieldPrefix = "myPrefixHere"; 
Html.RenderPartial("myPartialViewName", myPartialViewModel, dataDict); 

लो और देखें, आपके पार्टियल व्यू में सभी इनपुट प्रीफ़िक्स किए जाएंगे।

Kudos से R0MANARMY इसे इंगित करने के लिए।

+2

और एक लाइनर के रूप में: HTML।रेंडरपार्टियल ("myPartialViewName", myPartialViewModel, new ViewDataDictionary() {TemplateInfo = new TemplateInfo() {HtmlFieldPrefix = "myPrefixHere"}}) –

+0

यह बहुत अच्छा है, धन्यवाद – karaxuna

+0

यदि मैं रेंडरएक्शन का उपयोग कर रहा हूं और वह कार्रवाई बदले में आंशिक दृश्य, न तो आंशिक दृश्य न ही रेंडरएक्शन में एक ViewDataDictionary अधिभार है जिसे मैं देख सकता हूं। मैं उम्मीद कर रहा था कि यह 'वापसी आंशिक दृश्य' पर एक अधिभार होगा ('कोई सुझाव? – AaronLS

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