Reputation: 581
I have a htmleditorextender inside a form view. When trying to upload an image I get the following error:
An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code
My aspx:
<asp:FormView runat="server" ID="frmPost" Width="100%">
<ItemTemplate>
<div class="row">
<div class="col-sm-12">
<h3>Title:</h3>
<asp:TextBox ID="txtTitle" runat="server" CssClass="form-control" Text='<%# Eval("PostTitle") %>'></asp:TextBox>
<h3>Author:</h3>
<asp:TextBox ID="txtAuthor" runat="server" CssClass="form-control" Text='<%# Eval("Author") %>'></asp:TextBox>
<h3>Category:</h3>
<asp:HiddenField ID="hdnCat" runat="server" />
<asp:DropDownList ID="lstCat" runat="server" CssClass="form-control" AppendDataBoundItems="true">
<asp:ListItem Value="Please select" Text="Please select"></asp:ListItem>
</asp:DropDownList>
<h3>Post:</h3>
<ajaxToolkit:HtmlEditorExtender
ID="HtmlEditorExtender1"
OnImageUploadComplete="HtmlEditorExtender1_ImageUploadComplete"
DisplaySourceTab="true"
TargetControlID="txtPost"
EnableSanitization="false"
runat="server">
<Toolbar>
<ajaxToolkit:Undo />
<ajaxToolkit:Redo />
<ajaxToolkit:Bold />
<ajaxToolkit:Italic />
<ajaxToolkit:Underline />
<ajaxToolkit:StrikeThrough />
<ajaxToolkit:Subscript />
<ajaxToolkit:Superscript />
<ajaxToolkit:InsertOrderedList />
<ajaxToolkit:InsertUnorderedList />
<ajaxToolkit:CreateLink />
<ajaxToolkit:UnLink />
<ajaxToolkit:RemoveFormat />
<ajaxToolkit:BackgroundColorSelector />
<ajaxToolkit:ForeColorSelector />
<ajaxToolkit:FontSizeSelector />
<ajaxToolkit:Indent />
<ajaxToolkit:Outdent />
<ajaxToolkit:InsertImage />
</Toolbar>
</ajaxToolkit:HtmlEditorExtender>
<asp:TextBox ID="txtPost" runat="server" BackColor="White" TextMode="MultiLine" Text='<%# Eval("PostContent").ToString() %>' Width="100%" Rows="30">
</asp:TextBox>
</div>
</div>
<br />
<div class="row">
<div class="col-sm-4 col-sm-offset-1">
<asp:Button runat="server" ID="btnSubmit" CssClass="btn-block homJumBtn" ToolTip='<%# Eval("PostId") %>' Text="Update" OnClick="btnSubmit_Click" />
</div>
<div class="col-sm-4 col-sm-offset-1">
<asp:Button runat="server" ID="btnDelete" CssClass="btn-block homJumBtn" ToolTip='<%# Eval("PostId") %>' Text="Delete" OnClick="btnDelete_Click" />
</div>
</div>
</ItemTemplate>
</asp:FormView>
My code behind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Web.Configuration;
using System.Web.UI.HtmlControls;
public partial class Admin_editPost : System.Web.UI.Page
{
private string connectionString =
WebConfigurationManager.ConnectionStrings["GriffithsWebConnect"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string postident = Page.RouteData.Values["postid"].ToString();
hdnPost.Value = postident;
getPostData(Convert.ToInt32(postident));
getCatData();
HiddenField hdn = (HiddenField)frmPost.FindControl("hdnCat");
DropDownList ddl = (DropDownList)frmPost.FindControl("lstCat");
ddl.SelectedValue = hdn.Value;
}
}
protected void HtmlEditorExtender1_ImageUploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
{
AjaxControlToolkit.HtmlEditorExtender ext = (AjaxControlToolkit.HtmlEditorExtender)frmPost.FindControl("HtmlEditorExtender1");
ext.AjaxFileUpload.AllowedFileTypes = "jpg,JPEG,png";
string fullPath = @"~/images/postAssets/" + e.FileName;
// Save upload file to the file system
ext.AjaxFileUpload.SaveAs(Server.MapPath(fullPath));
e.PostedUrl = Page.ResolveUrl(fullPath);
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
TextBox titleTxt = (TextBox)frmPost.FindControl("txtTitle");
DropDownList catdrp = (DropDownList)frmPost.FindControl("lstCat");
TextBox authTxt = (TextBox)frmPost.FindControl("txtAuthor");
TextBox contentBox = (TextBox)frmPost.FindControl("txtPost");
if (titleTxt.Text != "" || contentBox.Text != "" || authTxt.Text != "" || catdrp.SelectedValue != "Please select")
{
int post = Convert.ToInt32(btn.ToolTip);
string title = titleTxt.Text;
string auth = authTxt.Text;
string cont = contentBox.Text;
byte cat = Convert.ToByte(catdrp.SelectedValue);
editPost(post, title, cat, auth, cont);
}
else
{
lblError.Text = "Form fields cannot be empty!";
}
}
protected void btnDelete_Click(object sender, EventArgs e)
{
deletePost();
}
protected void getPostData(int post)
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Blog.gwd_Posts", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter adp = new SqlDataAdapter(cmd);
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50));
cmd.Parameters["@Status"].Value = "ViewPost";
cmd.Parameters.Add(new SqlParameter("@postID", SqlDbType.Int));
cmd.Parameters["@postID"].Value = post;
try
{
con.Open();
DataSet ds = new DataSet();
adp.Fill(ds, "Post");
frmPost.DataSource = ds;
frmPost.DataBind();
HiddenField hdn = (HiddenField)frmPost.FindControl("hdnCat");
hdn.Value = ds.Tables["Post"].Rows[0]["Category"].ToString();
}
catch (Exception er)
{
lblError.Text = "Error retrieving post: " + er.ToString();
}
finally
{
con.Close();
}
}
protected void getCatData()
{
DropDownList ddl = (DropDownList)frmPost.FindControl("lstCat");
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Blog.gwd_Categories", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataReader rdr;
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50));
cmd.Parameters["@Status"].Value = "Display";
try
{
con.Open();
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
ListItem newItem = new ListItem();
newItem.Text = rdr["CatName"].ToString();
newItem.Value = rdr["CatId"].ToString();
ddl.Items.Add(newItem);
}
}
catch (Exception er)
{
lblError.Text = "Error getting categories: " + er.ToString();
}
finally
{
con.Close();
}
}
protected void editPost(int post, string title, byte cat, string auth, string cont)
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Blog.gwd_Posts", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50));
cmd.Parameters["@Status"].Value = "DeletePost";
cmd.Parameters.Add(new SqlParameter("@postID", SqlDbType.Int));
cmd.Parameters["@postID"].Value = post;
cmd.Parameters.Add(new SqlParameter("@postTitle", SqlDbType.VarChar, 100));
cmd.Parameters["@postTitle"].Value = title;
cmd.Parameters.Add(new SqlParameter("@Cat", SqlDbType.TinyInt));
cmd.Parameters["@Cat"].Value = cat;
cmd.Parameters.Add(new SqlParameter("@Auth", SqlDbType.VarChar, 150));
cmd.Parameters["@Auth"].Value = auth;
cmd.Parameters.Add(new SqlParameter("@Content", SqlDbType.NVarChar, -1));
cmd.Parameters["@Content"].Value = cont;
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception er)
{
lblError.Text = "Error updating post: " + er.Message;
}
finally
{
con.Close();
}
}
protected void deletePost()
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Blog.gwd_Posts", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50));
cmd.Parameters["@Status"].Value = "DeletePost";
cmd.Parameters.Add(new SqlParameter("@postID", SqlDbType.Int));
cmd.Parameters["@postID"].Value = Convert.ToInt32(Page.RouteData.Values["postid"]);
try
{
con.Open();
cmd.ExecuteNonQuery();
Response.RedirectToRoute("PostsRoute");
}
catch (Exception err)
{
lblError.Text = "Error deleting post: " + err.Message;
}
finally
{
con.Close();
}
}
}
The error occurs at the following line in the page_load event:
getPostData(Convert.ToInt32(postident));
The variable gets its initial value from
Page.Route.Values["postid"].ToString()
I do not know why the value of this variable has changed but it has changed to a value of:
the value of the string at this time is:
"AjaxFileUploadHandler.axd"
but I do not know why it has changed to this. I think it is this change that causes the error.
The event HtmlEditorExtender1_ImageUploadComplete
is not being fired and I'm unsure why. Any suggestions or insight that can be offered will be gratefully received. Is there something I'm missing? I have another htmleditorextender on another page which works fine. This one is in a formview so I don't know if that makes any difference.
Upvotes: 0
Views: 209
Reputation: 896
It seems you have routing rule that maps your the variable you expected to "AjaxFileUploadHandler.axd".
Add a new route that will trigger on image upload, so more general postid
route will not be hit.
Upvotes: 1