将usercontrol加载到字符串并在其中提交表单

时间:2012-02-16 05:00:43

标签: asp.net string templates user-controls url-rewriting

我正在做的是创建一个网站,其中设计完成html文件,然后使用System.IO.StreamReader读入母版页。 在html模板中有关键字,如#USER.LOGIN# 我用功能等替换。

问题是我正在替换#USER.LOGIN #with一个用户控件,其中有一个登录表单。 我有一个函数将usercontrol读入一个字符串,它的工作原理。 但由于usercontrol被加载到字符串alle,事件没有跟随。

因此,当我提交登录表单时,没有任何事情发生(页面发布),但无法从表单中获取任何字段...

注意: 我正在使用网址重写,因此网址为http://www.domain.com/account/login 其中account是account.aspx,login是帐户所在的模式。

替换streamreader循环中的关键字的代码(pr line)

If InStr(line, "#USER.LOGIN#") Then
                    line = line.Replace("#USER.LOGIN#", vbCrLf & userfunc.GetMyUserControlHtml("uc", "account_login.ascx", "/account/login/") & vbCrLf)
                End If

读取usercontrol的函数

 Public Shared Function GetMyUserControlHtml(contextKey As String, controllerfile As String, Optional ByVal formaction As String = "")
    Dim myId As Guid = New Guid()
    Return userfunc.RenderUserControl("~\Controllers\" & controllerfile, "", myId, formaction)
End Function

Public Shared Function RenderUserControl2(path As String, Optional ByVal formaction As String = "") As String
    Using pageHolder As New Page(), _
        viewControl As UserControl = DirectCast(pageHolder.LoadControl(path), UserControl), _
        output As New StringWriter(), _
        tempForm As New HtmlForm()
        If formaction <> "" Then
            tempForm.Action = formaction
        Else
            tempForm.Action = HttpContext.Current.Request.RawUrl
        End If
        tempForm.Controls.Add(viewControl)
        pageHolder.Controls.Add(tempForm)
        HttpContext.Current.Server.Execute(pageHolder, output, False)
        Dim outputToReturn As String = output.ToString()
        Return outputToReturn
    End Using
End Function

你怎么会这样做? 我需要在usercontrol中对userlogin进行硬编码,但仍然可以使用template关键字将其放在任何位置。 这也将与其他功能(简报注册,shoutbox等)一起使用

1 个答案:

答案 0 :(得分:0)

我建议的是在网络配置上注册你控制..

<add tagPrefix="CustomControl" tagName="LogIn" src="~/UserControls/Login.ascx"/>

您仍然可以使用“#USER.LOGIN#”,而不是用控件替换它... 用这样的东西替换它

<CustomControl:LogIn id="LogIn" runat="server"/>

这只是一个快速写的..但你总是可以尝试,如果它的工作

你可以保存你的HTML,而不是放置一个真正的“#USER.LOGIN#”

<% =GetLoginControl() %>

然后在名为GetLoginControl()的代码中创建一个公共函数,并返回所需的HTML标记的response.write