在派生页面中触发按钮事件时母版页方法 returns null
Masterpage method returns null when firing a button event in a derived page
基本上在母版页上我有一个方法 returns 一个 "campaign" 带有唯一 ID 和用户 ID 的参数。在我单击派生页面中的按钮之前效果很好。
问题是当我单击派生页面中的按钮时母版页中的方法 returns "null"。即使在调试时我也看到了正确的参数。
编辑// return 为空的方法:
var campaign = campaignRepository.GetCampaignById(convertedCampaignId, user.UserId);
母版页代码:
protected void Page_Load(object sender, EventArgs e)
{
string securityToken = "";
if (HttpContext.Current.Request.Cookies["SecurityToken"] != null)
{
securityToken = HttpContext.Current.Request.Cookies["SecurityToken"].Value.ToString();
}
var user = User.GetLoggedInUser(securityToken);
if (user != null)
{
var convertedCampaignId = Request.QueryString["cid"];
//If the querystring exists process ELSE force
if (!string.IsNullOrWhiteSpace(convertedCampaignId))
{
using (var campaignRepository = new CampaignRepository())
{
var campaign = campaignRepository.GetCampaignById(convertedCampaignId, user.UserId);
//Does the campaign exist from the passed in query string,
if (campaign != null)
{
ccid = "'" + campaign.ConvertedCampaignId + "'";
//Build Navigation
StringBuilder sbNav = new StringBuilder();
string nav = KTO.Common.Reader.ReadFile("/templates/html/side-nav.html");
sbNav.AppendLine(nav.Replace("{convertedCampaignId}", campaign.ConvertedCampaignId));
ltlNavItems.Text = sbNav.ToString();
ltlCampaignName.Text = "Campaign: " + "<strong>" + campaign.Name + "</strong>";
//Get campaigns for dropdown
IEnumerable<Campaign> campaigns = campaignRepository.GetCampaigns(user.UserId);
StringBuilder sbCampaigns = new StringBuilder();
string strCampaigns =
"<li title='{campaignName}' data-cid='{convertedCampaignId}' class='js-campaign-item'>" +
"<p class='name-message'><a href='/panel/c/{convertedCampaignId}/' class='campaign-lnk'>{campaignName}</a>" +
"</p>" +
"</li>";
foreach (var c in campaigns)
{
sbCampaigns.AppendLine(strCampaigns.Replace("{convertedCampaignId}", c.ConvertedCampaignId)
.Replace("{campaignId}", c.CampaignId.ToString())
.Replace("{campaignName}", c.Name));
}
}
else
{
Response.Redirect("/notifications/404/");
}
}
}
else
{
Response.Redirect("/notifications/404/");
}
}
else
{
Response.Redirect("/login/");
}
}
派生页面逻辑:
protected void btnInviteUsers_Click(object sender, EventArgs e)
{
if (txtEmail.Text.Trim() != "")
{
if (txtEmail.Text.Trim().Length < 75)
{
if (Common.Email.IsValidEmail(txtEmail.Text.Trim()) == true)
{
string securityToken = "";
if (HttpContext.Current.Request.Cookies["SecurityToken"] != null)
{
securityToken = HttpContext.Current.Request.Cookies["SecurityToken"].Value.ToString();
}
var user = Business.Entity.User.GetLoggedInUser(securityToken);
if (user != null)
{
try
{
using (var userRepo = new UserRepository())
{
var userInSystem = userRepo.UserExists(txtEmail.Text.Trim().RemoveHtml());
if (userInSystem == true)
{
ltlReturnMessage.Text = "Unfortunately we cannot send the request, as the user already exists.";
}
else
{
//Craft querystring
string encryptedEmail = user.EncryptedEmail;
int uid = user.UserId;
string userInviteHTML = Common.Reader.ReadFile("/templates/emails/user-invite.html");
StringBuilder sb = new StringBuilder();
sb.AppendLine(userInviteHTML.Replace("{link}", "http://localhost:52447/_user-invite/?inor-t-em=" + encryptedEmail + "&inor-d=" + uid.ToString()));
Common.Email.SendMail(txtEmail.Text.Trim(), "", "", user.FirstName + " " + user.LastName + " invited you to join x", sb.ToString());
ltlReturnMessage.Text = "Invite sent!";
}
}
}
catch
{
ltlReturnMessage.Text = "Problem sending invite, please try again.";
}
}
}
else
{
ltlReturnMessage.Text = "Are sure that's an email address? Please try again.";
}
}
else
{
ltlReturnMessage.Text = "Email Address must not exceed 75 characters.";
}
}
else
{
ltlReturnMessage.Text = "Email Address required.";
}
}
请考虑该方法在任何页面上 return "campaign" 但只是在页面回发时不会。
仔细检查每一行后,我注意到我的查询字符串重复了。当从我的派生页面触发按钮单击事件时,它会 post 返回 运行 我在母版页上的逻辑。我认为它对 url-重写造成了严重破坏。
我通过添加
解决了这个问题
frmInviteUser.Action = Request.RawUrl;
在我的派生页面的 page_load 中,这将强制 url 而不是 post 返回主页面的请求。
这就是我在方法上得到空值的原因,传递的参数是重复的。
此致,
基本上在母版页上我有一个方法 returns 一个 "campaign" 带有唯一 ID 和用户 ID 的参数。在我单击派生页面中的按钮之前效果很好。
问题是当我单击派生页面中的按钮时母版页中的方法 returns "null"。即使在调试时我也看到了正确的参数。
编辑// return 为空的方法:
var campaign = campaignRepository.GetCampaignById(convertedCampaignId, user.UserId);
母版页代码:
protected void Page_Load(object sender, EventArgs e)
{
string securityToken = "";
if (HttpContext.Current.Request.Cookies["SecurityToken"] != null)
{
securityToken = HttpContext.Current.Request.Cookies["SecurityToken"].Value.ToString();
}
var user = User.GetLoggedInUser(securityToken);
if (user != null)
{
var convertedCampaignId = Request.QueryString["cid"];
//If the querystring exists process ELSE force
if (!string.IsNullOrWhiteSpace(convertedCampaignId))
{
using (var campaignRepository = new CampaignRepository())
{
var campaign = campaignRepository.GetCampaignById(convertedCampaignId, user.UserId);
//Does the campaign exist from the passed in query string,
if (campaign != null)
{
ccid = "'" + campaign.ConvertedCampaignId + "'";
//Build Navigation
StringBuilder sbNav = new StringBuilder();
string nav = KTO.Common.Reader.ReadFile("/templates/html/side-nav.html");
sbNav.AppendLine(nav.Replace("{convertedCampaignId}", campaign.ConvertedCampaignId));
ltlNavItems.Text = sbNav.ToString();
ltlCampaignName.Text = "Campaign: " + "<strong>" + campaign.Name + "</strong>";
//Get campaigns for dropdown
IEnumerable<Campaign> campaigns = campaignRepository.GetCampaigns(user.UserId);
StringBuilder sbCampaigns = new StringBuilder();
string strCampaigns =
"<li title='{campaignName}' data-cid='{convertedCampaignId}' class='js-campaign-item'>" +
"<p class='name-message'><a href='/panel/c/{convertedCampaignId}/' class='campaign-lnk'>{campaignName}</a>" +
"</p>" +
"</li>";
foreach (var c in campaigns)
{
sbCampaigns.AppendLine(strCampaigns.Replace("{convertedCampaignId}", c.ConvertedCampaignId)
.Replace("{campaignId}", c.CampaignId.ToString())
.Replace("{campaignName}", c.Name));
}
}
else
{
Response.Redirect("/notifications/404/");
}
}
}
else
{
Response.Redirect("/notifications/404/");
}
}
else
{
Response.Redirect("/login/");
}
}
派生页面逻辑:
protected void btnInviteUsers_Click(object sender, EventArgs e)
{
if (txtEmail.Text.Trim() != "")
{
if (txtEmail.Text.Trim().Length < 75)
{
if (Common.Email.IsValidEmail(txtEmail.Text.Trim()) == true)
{
string securityToken = "";
if (HttpContext.Current.Request.Cookies["SecurityToken"] != null)
{
securityToken = HttpContext.Current.Request.Cookies["SecurityToken"].Value.ToString();
}
var user = Business.Entity.User.GetLoggedInUser(securityToken);
if (user != null)
{
try
{
using (var userRepo = new UserRepository())
{
var userInSystem = userRepo.UserExists(txtEmail.Text.Trim().RemoveHtml());
if (userInSystem == true)
{
ltlReturnMessage.Text = "Unfortunately we cannot send the request, as the user already exists.";
}
else
{
//Craft querystring
string encryptedEmail = user.EncryptedEmail;
int uid = user.UserId;
string userInviteHTML = Common.Reader.ReadFile("/templates/emails/user-invite.html");
StringBuilder sb = new StringBuilder();
sb.AppendLine(userInviteHTML.Replace("{link}", "http://localhost:52447/_user-invite/?inor-t-em=" + encryptedEmail + "&inor-d=" + uid.ToString()));
Common.Email.SendMail(txtEmail.Text.Trim(), "", "", user.FirstName + " " + user.LastName + " invited you to join x", sb.ToString());
ltlReturnMessage.Text = "Invite sent!";
}
}
}
catch
{
ltlReturnMessage.Text = "Problem sending invite, please try again.";
}
}
}
else
{
ltlReturnMessage.Text = "Are sure that's an email address? Please try again.";
}
}
else
{
ltlReturnMessage.Text = "Email Address must not exceed 75 characters.";
}
}
else
{
ltlReturnMessage.Text = "Email Address required.";
}
}
请考虑该方法在任何页面上 return "campaign" 但只是在页面回发时不会。
仔细检查每一行后,我注意到我的查询字符串重复了。当从我的派生页面触发按钮单击事件时,它会 post 返回 运行 我在母版页上的逻辑。我认为它对 url-重写造成了严重破坏。
我通过添加
解决了这个问题frmInviteUser.Action = Request.RawUrl;
在我的派生页面的 page_load 中,这将强制 url 而不是 post 返回主页面的请求。
这就是我在方法上得到空值的原因,传递的参数是重复的。
此致,