Problem initializing properties

I keep getting this error: CS0501: 'jQueryUploadTest.Upload.FilesStatus.thumbnail_url.get' should declare the body because it is not marked abstract or external

I have this exact code outside my sharepoint project on its own separate website and it works great. Whenever I try to implement it in my sharepoint project, I get this error.

Here is the code for my upload.ashx file:

<%@ WebHandler Language="C#" Class="jQueryUploadTest.Upload" %> using System; using System.Collections.Generic; using System.IO; using System.Security.AccessControl; using System.Web; using System.Web.Script.Serialization; namespace jQueryUploadTest { public class Upload : IHttpHandler { public class FilesStatus { public string thumbnail_url { get; set; } public string name { get; set; } public string url { get; set; } public int size { get; set; } public string type { get; set; } public string delete_url { get; set; } public string delete_type { get; set; } public string error { get; set; } public string progress { get; set; } } private readonly JavaScriptSerializer js = new JavaScriptSerializer(); private string ingestPath; public bool IsReusable { get { return false; } } public void ProcessRequest (HttpContext context) { //var r = context.Response; ingestPath = @"C:\temp\ingest\"; context.Response.AddHeader("Pragma", "no-cache"); context.Response.AddHeader("Cache-Control", "private, no-cache"); HandleMethod(context); } private void HandleMethod (HttpContext context) { switch (context.Request.HttpMethod) { case "HEAD": case "GET": ServeFile(context); break; case "POST": UploadFile(context); break; case "DELETE": DeleteFile(context); break; default: context.Response.ClearHeaders(); context.Response.StatusCode = 405; break; } } private void DeleteFile (HttpContext context) { string filePath = ingestPath + context.Request["f"]; if (File.Exists(filePath)) { File.Delete(filePath); } } private void UploadFile (HttpContext context) { List<FilesStatus> statuses = new List<FilesStatus>(); System.Collections.Specialized.NameValueCollection headers = context.Request.Headers; if (string.IsNullOrEmpty(headers["X-File-Name"])) { UploadWholeFile(context, statuses); } else { UploadPartialFile(headers["X-File-Name"], context, statuses); } WriteJsonIframeSafe(context, statuses); } private void UploadPartialFile (string fileName, HttpContext context, List<FilesStatus> statuses) { if (context.Request.Files.Count != 1) throw new HttpRequestValidationException("Attempt to upload chunked file containing more than one fragment per request"); Stream inputStream = context.Request.Files[0].InputStream; string fullName = ingestPath + Path.GetFileName(fileName); using (FileStream fs = new FileStream(fullName, FileMode.Append, FileAccess.Write)) { byte[] buffer = new byte[1024]; int l = inputStream.Read(buffer, 0, 1024); while (l > 0) { fs.Write(buffer,0,l); l = inputStream.Read(buffer, 0, 1024); } fs.Flush(); fs.Close(); } FilesStatus MyFileStatus = new FilesStatus(); MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + fileName; MyFileStatus.url = "Upload.ashx?f=" + fileName; MyFileStatus.name = fileName; MyFileStatus.size = (int)(new FileInfo(fullName)).Length; MyFileStatus.type = "image/png"; MyFileStatus.delete_url = "Upload.ashx?f=" + fileName; MyFileStatus.delete_type = "DELETE"; MyFileStatus.progress = "1.0"; /* { thumbnail_url = "Thumbnail.ashx?f=" + fileName, url = "Upload.ashx?f=" + fileName, name = fileName, size = (int)(new FileInfo(fullName)).Length, type = "image/png", delete_url = "Upload.ashx?f=" + fileName, delete_type = "DELETE", progress = "1.0" }; */ statuses.Add(MyFileStatus); } private void UploadWholeFile(HttpContext context, List<FilesStatus> statuses) { for (int i = 0; i < context.Request.Files.Count; i++) { HttpPostedFile file = context.Request.Files[i]; file.SaveAs(ingestPath + Path.GetFileName(file.FileName)); string fileName = Path.GetFileName(file.FileName); FilesStatus MyFileStatus = new FilesStatus(); MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + fileName; MyFileStatus.url = "Upload.ashx?f=" + fileName; MyFileStatus.name = fileName; MyFileStatus.size = file.ContentLength; MyFileStatus.type = "image/png"; MyFileStatus.delete_url = "Upload.ashx?f=" + fileName; MyFileStatus.delete_type = "DELETE"; MyFileStatus.progress = "1.0"; statuses.Add(MyFileStatus); } } private void WriteJsonIframeSafe(HttpContext context, List<FilesStatus> statuses) { context.Response.AddHeader("Vary", "Accept"); try { if (context.Request["HTTP_ACCEPT"].Contains("application/json")) { context.Response.ContentType = "application/json"; } else { context.Response.ContentType = "text/plain"; } } catch { context.Response.ContentType = "text/plain"; } string jsonObj = js.Serialize(statuses.ToArray()); context.Response.Write(jsonObj); } private void ServeFile (HttpContext context) { if (string.IsNullOrEmpty(context.Request["f"])) ListCurrentFiles(context); else DeliverFile(context); } private void DeliverFile (HttpContext context) { string filePath = ingestPath + context.Request["f"]; if (File.Exists(filePath)) { context.Response.ContentType = "application/octet-stream"; context.Response.WriteFile(filePath); context.Response.AddHeader("Content-Disposition", "attachment, filename=\"" + context.Request["f"] + "\""); } else { context.Response.StatusCode = 404; } } private void ListCurrentFiles (HttpContext context) { List<FilesStatus> files = new List<FilesStatus>(); string[] names = Directory.GetFiles(@"C:\temp\ingest", "*", SearchOption.TopDirectoryOnly); foreach (string name in names) { FileInfo f = new FileInfo(name); FilesStatus MyFileStatus = new FilesStatus(); MyFileStatus.thumbnail_url = "Thumbnail.ashx?f=" + f.Name; MyFileStatus.url = "Upload.ashx?f=" + f.Name; MyFileStatus.name = f.Name; MyFileStatus.size = (int)f.Length; MyFileStatus.type = "image/png"; MyFileStatus.delete_url = "Upload.ashx?f=" + f.Name; MyFileStatus.delete_type = "DELETE"; files.Add(MyFileStatus); /*files.Add(new FilesStatus { thumbnail_url = "Thumbnail.ashx?f=" + f.Name, url = "Upload.ashx?f=" + f.Name, name = f.Name, size = (int)f.Length, type = "image/png", delete_url = "Upload.ashx?f=" + f.Name, delete_type = "DELETE" });*/ } context.Response.AddHeader("Content-Disposition", "inline, filename=\"files.json\""); string jsonObj = js.Serialize(files.ToArray()); context.Response.Write(jsonObj); context.Response.ContentType = "application/json"; } } } 

I checked my version targeting and its asp.net 3.5, I went over to the properties in my project and 3.5, so I don’t think this is a problem.

+4
source share
2 answers

I only realized what was going on when I noticed this line:

 <%@ WebHandler Language="C#" Class="jQueryUploadTest.Upload" %> 

You create a page handle (possibly *.ashx ), and this will no doubt compile in the ASP.Net 1.1 application pool. This does not support the C # 3.0 construct, and therefore it fails.

See if you can move the site to the ASP.Net 2.0 application pool. The problem should disappear. Keep in mind that there are minor incompatible changes between the frameworks 1.1 and 2.0, which may require you to configure your web.config and minor other details.

I don't want this, the easiest way is to simply not use the C # 3.0 style construct:

 public class FilesStatus { private string m_thumbnail_url; private string m_name; private string m_url; private int m_size; private string m_type; private string m_delete_url; private string m_delete_type; private string m_error; private string m_progress; public string m_thumbnailurl { get { return m_thumbnail_url; } set { m_thumbnail_url = value; } } public string name { get { return m_name; } set { m_name = value; } } public string url { get { return m_url; } set { m_url = value; } } public int size { get { return m_size; } set { m_size = value; } } public string type { get { return m_type; } set { m_type = value; } } public string m_deleteurl { get { return m_delete_url; } set { m_delete_url = value; } } public string m_deletetype { get { return m_delete_type; } set { m_delete_type = value; } } public string error { get { return m_error; } set { m_error = value; } } public string progress { get { return m_progress; } set { m_progress = value; } } } 
+1
source

Change Although this is a small opportunity, perhaps it is not. I suggest you first look at my other answer .

The problem is that your version of the framework is different for the sharepoint project. See if you can target the framework 3.5 or higher.

See documentation :

In C # 3.0 and later, automatically implemented properties make property declarations more concise if additional logic is not needed in property accessories. They also allow client code to create objects. When you declare a property, as shown in the following example, the compiler creates a private, anonymous support field that can only be accessed through the get and set accessors property.

So this is:

  public string thumbnail_url { get; set; } 

will work only in an abstract class (with an abstract keyword) or in an interface (without a public keyword); In C # 3.0+, an anonymous support field will be created instead

Update

I just tried to make it plausible that you can target the 3.5 framework while still using the C # pre-3.0 language specification. I don't have Visual Studio right now, but I used monodevelop:

enter image description here

I can only imagine that Visual Studio has a similar option (hidden) somewhere, and the error message is a little less useful

0
source

All Articles