GridView को एक फॉर्म टैग के अंदर रनैट = "सर्वर" के साथ रखा जाना चाहिए, भले ही ग्रिड व्यू एक फॉर्म टैग के भीतर हो


86
<form runat="server" id="f1">
    <div runat="server" id="d">
        grid view:
        <asp:GridView runat="server" ID="g">
        </asp:GridView>
    </div>

    <asp:TextBox runat="server" ID="t" TextMode="MultiLine" Rows="20" Columns="50"></asp:TextBox>
</form>

कोड के पीछे:

public partial class ScriptTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        g.DataSource = new string[] { "a", "b", "c" };
        g.DataBind();

        TextWriter tw = new StringWriter();
        HtmlTextWriter h = new HtmlTextWriter(tw);    
        d.RenderControl(h);
        t.Text = tw.ToString();
    }
}

यहां तक ​​कि ग्रिड व्यू रनैट = "सर्वर" से टैग के भीतर है, फिर भी मुझे यह त्रुटि मिल रही है।

कृपया कोई सुराग?


2
मैंने इसे पहले देखा है अगर कोई मास्टर पृष्ठ का उपयोग कर रहा है जिसमें पहले से ही एक फार्म टैग है (जो पहले से ही runat="server"इस <form>टैग में घोषित हो सकता है या नहीं भी हो सकता है )। जरा
— सोचिए

@ लॉयड: लेकिन मेरे पास कोई मास्टर पेज नहीं है, मैंने इस पेज को केवल इस त्रुटि के परीक्षण के लिए बनाया है।
— 12

नमस्ते, मैंने आपका कोड कॉपी कर लिया है लेकिन समस्या को दोहरा नहीं सकता। क्या आप कृपया पूरी फ़ाइल सामग्री (प्रत्येक पंक्ति) को अपने प्रश्न में डाल सकते हैं, या इसे पास्टबिन कर सकते हैं? धन्यवाद
— christofr

जवाबों:


174

आप कॉल कर रहे हैं GridView.RenderControl(htmlTextWriter), इसलिए पेज एक अपवाद उठाता है कि सर्वर-कंट्रोल को एक फॉर्म के बाहर प्रस्तुत किया गया था।

आप VerifyRenderingInServerForm को ओवरराइड करके इस निष्पादन से बच सकते हैं

public override void VerifyRenderingInServerForm(Control control)
{
  /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
     server control at run time. */
}

यहाँ और यहाँ देखें ।


मेरे पास एक GridView है जिसकी सामग्री मैं एक ईमेल संदेश में प्रस्तुत करना चाहता हूं, यही कारण है कि मुझे इसे फ़ॉर्म से बाहर करने की आवश्यकता है। मैं इस विधि को ओवरराइड नहीं कर सकता क्योंकि होस्ट पेज शेयरपॉइंट का है। माई ग्रिड शेयरपॉइंट पेज में एक वेब पार्ट के अंदर एक यूजर कॉन्ट्रॉल है।
— किशोर जू

इसके अलावा, जब मैं उस ग्रिड को सीधे HtmlForm में गतिशील रूप से जोड़ता हूं, और फिर इसे प्रस्तुत करता हूं, तो यह पूरी तरह से प्रस्तुत करता है। इसका मतलब है कि इसे केवल ग्रिड के बाहर एक फॉर्म की उपस्थिति की आवश्यकता है। लेकिन, जब मैं उस DIV को HtmlForm में गतिशील रूप से जोड़ता हूं, तो यह त्रुटि फिर से आती है, हालांकि ग्रिड DIV का एक बच्चा है और इसके साथ HtmlForm में भी जोड़ा गया है।
— किशोर जू

यह काम नहीं करेगा अगर आपका ग्रिड एक .ascx उपयोगकर्ता नियंत्रण के अंदर है। उस मामले में क्रिस मुलिंस नीचे जवाब देखें। मैंने टिम और क्रिस दोनों की तकनीकों का उपयोग किया है और वे शानदार काम करते हैं।
— टेलर ब्राउन

मैं एक सुंदर समाधान प्यार करता हूँ! मुझे उत्साहित करता है: डी
— निकोले

3
बढ़िया काम किया। बस एक सिर आप एक त्रुटि कह सकते हैं "RegisterForEventValidation केवल रेंडर () के दौरान कहा जा सकता है;" यदि ऐसा है तो पृष्ठ के लिए मार्कअप में झूठी के लिए EventValidation सेट करना सुनिश्चित करें।
— अल बेलमांडो

29

VerifyRenderingInServerForm को ओवरराइड करने का एक विकल्प यह है कि आप रेंडर करते समय नियंत्रण संग्रह से ग्रिड को हटा दें और पृष्ठ लोड होने से पहले समाप्त होने पर इसे वापस जोड़ें। यह उपयोगी है यदि आप ग्रिड एचटीएमएल प्राप्त करने के लिए कुछ सामान्य सहायक विधि चाहते हैं क्योंकि आपको ओवरराइड को जोड़ने के लिए याद रखने की आवश्यकता नहीं है।

Control parent = grid.Parent;
int GridIndex = 0;
if (parent != null)
{
    GridIndex = parent.Controls.IndexOf(grid);
    parent.Controls.Remove(grid);
}

grid.RenderControl(hw);

if (parent != null)
{
    parent.Controls.AddAt(GridIndex, grid);
}

ओवरराइड से बचने का एक और विकल्प यह है:

grid.RenderBeginTag(hw);
grid.HeaderRow.RenderControl(hw);
foreach (GridViewRow row in grid.Rows)
{
    row.RenderControl(hw);
}
grid.FooterRow.RenderControl(hw);
grid.RenderEndTag(hw);

Adroit !! मैं कल इसकी कोशिश करूंगा।
— 19

जब एक एस्प उपयोगकर्ता नियंत्रण (.ascx) के अंदर ग्रिड को प्रस्तुत करने की कोशिश कर रहा है, तो 1 विधि का उपयोग करके मेरे लिए बहुत अच्छा काम किया।
— टेलर ब्राउन

3
1. यह काम नहीं करता है यदि ग्रिडव्यू में लिंकबटन की तरह नियंत्रण होता है - यह 'कंट्रोल ऑफ टाइप' लिंकबटन देता है जिसे रनैट = सर्वर की त्रुटि के साथ एक फॉर्म टैग के अंदर रखा जाना चाहिए। 2.क्या आप कृपया बताएं कि यह तकनीक क्यों काम करती है?
— बॉर्नटोडकोड

कोड में अपने ग्रिडव्यू के लिए @BornToCode अक्षम करना।
— आदि सौर

14

अपने Page_Load को जोड़ने के बाद:

public override void VerifyRenderingInServerForm(Control control)
{
    //base.VerifyRenderingInServerForm(control);
}

ध्यान दें कि मैं फ़ंक्शन में कुछ भी नहीं करता हूं।

संपादित करें: टिम ने एक ही बात का जवाब दिया। :) आप यहाँ उत्तर भी पा सकते हैं


2

बस इसे करने का एक और तरीका जोड़ना चाहते हैं। मैंने विभिन्न संबंधित थ्रेड्स पर कई लोगों से पूछा है कि क्या आप इसे माता-पिता पृष्ठ पर जोड़े बिना VerifyRenderingInServerForm का उपयोग कर सकते हैं।

आप वास्तव में यह कर सकते हैं, लेकिन यह थोड़ा चकमा है।

सबसे पहले एक नया पेज क्लास बनाएं, जो निम्नलिखित की तरह दिखता है:

public partial class NoRenderPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    { }

    public override void VerifyRenderingInServerForm(Control control)
    {
        //Allows for printing
    }

    public override bool EnableEventValidation
    {
        get { return false; }
        set { /*Do nothing*/ }
    }
}

एक .ASPX के साथ जुड़े होने की आवश्यकता नहीं है

फिर जिस नियंत्रण में आप रेंडर करना चाहते हैं, आप निम्नलिखित की तरह कुछ कर सकते हैं।

    StringWriter tw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    var page = new NoRenderPage();
    page.DesignerInitialize();
    var form = new HtmlForm();
    page.Controls.Add(form);
    form.Controls.Add(pnl);
    controlToRender.RenderControl(hw);

अब आप अपना मूल नियंत्रण HTML के रूप में प्रदान कर चुके हैं। यदि आपको जरूरत है, तो नियंत्रण को मूल स्थिति में वापस जोड़ें। अब आपके पास HTML रेंडर हो गया है, पेज सामान्य है और पेज में कोई बदलाव नहीं है।


@DanielEdwards डिज़ाइनर इंसुलेटिज़ () आपके लिए क्या करता है?
— JJS

यह काम करता है, लेकिन मुझे HttpContext.Current.Server.Execute(page, writer, false);HTML लिखने के लिए उपयोग करने की आवश्यकता है - कॉलिंग controlToRender.RenderControl(hw);ने किसी भी नियंत्रण की घटनाओं को नहीं उठाया है उदाहरण के लिए Page_Loadजब तक नियंत्रण प्रदान कर रहा था, यह खाली था।
— DGBbs 11:10 बजे

0

यहाँ मेरा कोड है

protected void btnExcel_Click(object sender, ImageClickEventArgs e)
    {
        if (gvDetail.Rows.Count > 0)
        {
            System.IO.StringWriter stringWrite1 = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htmlWrite1 = new HtmlTextWriter(stringWrite1);
            gvDetail.RenderControl(htmlWrite1);

            gvDetail.AllowPaging = false;
            Search();
            sh.ExportToExcel(gvDetail, "Report");
        }
    }

    public override void VerifyRenderingInServerForm(Control control)
    {
        /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
           server control at run time. */
    }

आपने इसका उत्तर देने के 5 साल बाद इसे क्यों जोड़ा? और यह एक ही जवाब है।
— मुकुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.