public string GetAnswers()
        {
            try
            {
                var userId = Request.Params["userId"];
                var context = new ApplicationDbContext();
                var user = context.Users.FirstOrDefault(u => u.Id == userId);
                if (user != null)
                {
                    var contextForum = new ForumEntities();
                    int answerCount = contextForum.Answers.Count(a => a.AuthorId == userId);
                    if (answerCount == 0)
                    {
                        return "No Questions";
                    }
                    else if (answerCount == 1)
                    {
                        return "1 answer";
                    }
                    else
                    {
                        return answerCount + " answers";
                    }
                }
                else
                {
                    throw new ArgumentException("User not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        public IQueryable<ForumApp.Models.Question> ListViewQuestions_GetData()
        {
            try
            {
                var categoryId = int.Parse(Request.Params["categoryId"]);
                var context = new ForumEntities();
                var category = context.Categories.FirstOrDefault(c => c.Id == categoryId);
                if (category != null)
                {
                    var questions = category.Questions.OrderByDescending(x => x.PostedDate);

                    return questions.AsQueryable();

                }
                else
                {
                    throw new ArgumentException("Category not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        // The return type can be changed to IEnumerable, however to support
        // paging and sorting, the following parameters must be added:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<ForumApp.Models.Question> ListViewQuestions_GetData()
        {
            ForumEntities context = new ForumEntities();
            var questions = context.Questions.OrderByDescending(x => x.PostedDate);

            return questions;
        }
 // The id parameter name should match the DataKeyNames value set on the control
 public void FormViewQuestion_UpdateItem(int id)
 {
     try
     {
         var context = new ForumEntities();
         ForumApp.Models.Question item = context.Questions.FirstOrDefault(a => a.Id == id);
         // Load the item here, e.g. item = MyDataLayer.Find(id);
         if (item == null)
         {
             // The item wasn't found
             ModelState.AddModelError("", String.Format("Item with id {0} was not found", id));
             return;
         }
         TryUpdateModel(item);
         if (ModelState.IsValid)
         {
             // Save changes here, e.g. MyDataLayer.SaveChanges();
             context.Entry(item).State = System.Data.Entity.EntityState.Modified;
             context.SaveChanges();
         }
         ErrorSuccessNotifier.AddInfoMessage("Question successfuly edited!");
     }
     catch (Exception ex)
     {
         ErrorSuccessNotifier.AddErrorMessage("Server Error: " + ex.Message);
     }
 }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            ForumEntities context = new ForumEntities();

            this.DropDownListCategory.DataSource = context.Categories.ToList();
            this.DropDownListCategory.SelectedIndex = 0;
            this.DropDownListCategory.DataBind();
        }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            ForumEntities context = new ForumEntities();
            var categories = context.Categories.ToList();
            this.RepeaterCategories.DataSource = categories;
            this.RepeaterCategories.DataBind();

            this.AddCategoryPanel.Visible = this.IsAdminInRole();
        }
        // The return type can be changed to IEnumerable, however to support
        // paging and sorting, the following parameters must be added:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<ForumApp.Models.Question> ListViewOpenedQuestions_GetData([Control] string byUser)
        {
            ForumApp.Models.ForumEntities context = new Models.ForumEntities();
            var questions = context.Questions.Where(x => x.Answers.Count == 0).OrderBy(x => x.PostedDate);
            if (byUser != null)
            {
                questions = questions.Where(x => x.AspNetUser.UserName == byUser).OrderBy(x => x.PostedDate);
            }

            return questions;
        }
        protected void Save_Click(object sender, EventArgs e)
        {
            try
            {
                ForumEntities context = new ForumEntities();
                var currentCat = context.Categories.Find(Id);
                currentCat.Title = this.CatNameTb.Text;
                context.SaveChanges();

                Response.Redirect("~/Categories.aspx", false);
                Error_Handler_Control.ErrorSuccessNotifier.AddSuccessMessage("Successfuly edited");
                Error_Handler_Control.ErrorSuccessNotifier.ShowAfterRedirect = true;
            }
            catch (Exception ex)
            {
                Error_Handler_Control.ErrorSuccessNotifier.AddErrorMessage("Error: " + ex.Message);
            }
        }
        protected void ButtonAddQuestion_Click(object sender, EventArgs e)
        {
            string title = this.TextBoxQuestionTitle.Text;
            int categoryId = Convert.ToInt32(this.DropDownListCategory.SelectedValue);
            string content = this.TextBoxContent.Text;

            if (title.Length < 6)
            {
                ErrorSuccessNotifier.AddErrorMessage("Title length must be at least 6 chars!");
            }
            else if (content.Length < 10)
            {
                ErrorSuccessNotifier.AddErrorMessage("Content length must be at least 10 chars!");
            }
            else
            {
                try
                {
                    ForumEntities context = new ForumEntities();
                    AspNetUser author = context.AspNetUsers.Where(x => x.UserName == User.Identity.Name).FirstOrDefault();

                    ForumApp.Models.Question addedQuestion = new ForumApp.Models.Question()
                    {
                        Title = title,
                        Content = content,
                        CategoryId = categoryId,
                        AuthorId = author.Id,
                        PostedDate = DateTime.Now
                    };

                    context.Questions.Add(addedQuestion);
                    context.SaveChanges();
                    ErrorSuccessNotifier.AddSuccessMessage("Question added successfuly!");
                    ErrorSuccessNotifier.ShowAfterRedirect = true;
                    Response.Redirect("~/Question?questionId=" + addedQuestion.Id);
                }
                catch (Exception ex)
                {
                    ErrorSuccessNotifier.AddErrorMessage("Server Error: " + ex.Message);

                }
            }
        }
        // The id parameter should match the DataKeyNames value set on the control
        // or be decorated with a value provider attribute, e.g. [QueryString]int id
        public ForumApp.Models.Question FormViewQuestion_GetItem()
        {
            try
            {
                var questionId = int.Parse(Request.Params["questionId"]);
                var context = new ForumEntities();
                var question = context.Questions.FirstOrDefault(q => q.Id == questionId);
                if (question != null)
                {
                    return question;
                }
                else
                {
                    throw new ArgumentException("Question not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
 protected void LinkButtonAdd_Click(object sender, EventArgs e)
 {
     if (String.IsNullOrEmpty(this.NewCatTextBox.Text))
     {
         ErrorSuccessNotifier.AddErrorMessage("Please enter valid category name!");
     }
     else
     {
         string catName = this.NewCatTextBox.Text;
         var context = new ForumEntities();
         try
         {
             context.Categories.Add(new Models.Category() { Title = catName });
             context.SaveChanges();
             this.NewCatTextBox.Text = null;
             ErrorSuccessNotifier.AddSuccessMessage("Category added successfuly!");
         }
         catch (Exception ex)
         {
             ErrorSuccessNotifier.AddErrorMessage("Server error: " + ex.Message);
         }
     }
 }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            try
            {
                var categoryId = int.Parse(Request.Params["categoryId"]);
                var context = new ForumEntities();
                var category = context.Categories.FirstOrDefault(c => c.Id == categoryId);
                if (category != null)
                {
                    this.LiteralCategoryTitle.Text = "Recent questions in "+category.Title;

                }
                else
                {
                    throw new ArgumentException("Category not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        // The return type can be changed to IEnumerable, however to support
        // paging and sorting, the following parameters must be added:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<ForumApp.Models.Question> ListViewQuestionsByUser_GetData()
        {
            try
            {
                var userId = Request.Params["userId"];
                var context = new ApplicationDbContext();
                var user = context.Users.FirstOrDefault(u => u.Id == userId);
                if (user != null)
                {
                    var contextForum = new ForumEntities();
                    var activity = contextForum.Questions
                        .Include("Answers")
                        .Where(q => q.AuthorId == userId || q.Answers.Any(a => a.AuthorId == userId))
                        .OrderByDescending(q => q.PostedDate);

                    return activity;
                }
                else
                {
                    throw new ArgumentException("User not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
 protected void Page_PreRender(object sender, EventArgs e)
 {
     ForumEntities context = new ForumEntities();
     int id = Id;
     this.CatNameTb.Text = context.Categories.Find(id).Title;
 }
        private bool CheckAdminPermissions(string currentUsername)
        {
            using (var context = new ForumEntities())
            {
                var user = context.AspNetUsers.FirstOrDefault(u => u.UserName == currentUsername);
                if (user != null)
                {
                    var userAdmin = user.AspNetRoles.FirstOrDefault(r => r.Name == "Administrator");
                    if (userAdmin != null)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }

                }
                else
                {
                    return false;
                }
            }
        }
        // The id parameter name should match the DataKeyNames value set on the control
        public void ListViewAnswers_DeleteItem(int id)
        {
            try
            {
                var questionId = int.Parse(Request.Params["questionId"]);
                var context = new ForumEntities();
                var question = context.Questions.FirstOrDefault(q => q.Id == questionId);
                if (question != null)
                {

                    var answer = context.Answers.FirstOrDefault(a => a.Id == id);
                    if (answer != null)
                    {
                        question.Answers.Remove(answer);
                        context.Answers.Remove(answer);
                        context.SaveChanges();
                        ErrorSuccessNotifier.AddInfoMessage("Answer successfuly deleted");
                    }
                    else
                    {
                        throw new ArgumentException("Answer not found");
                    }
                }
                else
                {
                    throw new ArgumentException("Question not found");
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
 // The return type can be changed to IEnumerable, however to support
 // paging and sorting, the following parameters must be added:
 //     int maximumRows
 //     int startRowIndex
 //     out int totalRowCount
 //     string sortByExpression
 public IQueryable<ForumApp.Models.Category> ListViewCategories_GetData()
 {
     ForumEntities context = new ForumEntities();
     var categories = context.Categories;
     return categories;
 }
        // The return type can be changed to IEnumerable, however to support
        // paging and sorting, the following parameters must be added:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<ForumApp.Models.Answer> ListViewAnswers_GetData()
        {
            try
            {
                var questionId = int.Parse(Request.Params["questionId"]);
                var context = new ForumEntities();
                var question = context.Questions.Include("Answers").FirstOrDefault(q => q.Id == questionId);
                if (question != null)
                {
                    return question.Answers.AsQueryable();
                }
                else
                {
                    throw new ArgumentException("Question not found");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        public void ListViewAnswers_InsertItem()
        {
            var answer = new ForumApp.Models.Answer();
            TryUpdateModel(answer);
            if (ModelState.IsValid)
            {
                try
                {
                    var questionId = int.Parse(Request.Params["questionId"]);
                    var context = new ForumEntities();
                    var question = context.Questions.FirstOrDefault(q => q.Id == questionId);
                    if (question != null)
                    {
                        var user = context.AspNetUsers.FirstOrDefault(u => u.UserName == User.Identity.Name);
                        if (user != null)
                        {
                            answer.AspNetUser = user;
                            answer.PostedDate = DateTime.Now;

                            question.Answers.Add(answer);
                            context.SaveChanges();
                            this.ListViewAnswers.InsertItemPosition = InsertItemPosition.None;
                            ErrorSuccessNotifier.AddSuccessMessage("Ansew added successfuly!");
                        }
                    }
                    else
                    {
                        throw new ArgumentException("Question not found");
                    }
                }
                catch (Exception ex)
                {
                    ErrorSuccessNotifier.AddErrorMessage(ex.Message);
                }

            }
        }
        // The id parameter name should match the DataKeyNames value set on the control
        public void ListViewAnswers_UpdateItem(int id)
        {
            var context = new ForumEntities();
            ForumApp.Models.Answer item = context.Answers.FirstOrDefault(a=> a.Id==id);
            // Load the item here, e.g. item = MyDataLayer.Find(id);
            if (item == null)
            {
                // The item wasn't found
                ModelState.AddModelError("", String.Format("Item with id {0} was not found", id));
                return;
            }
            TryUpdateModel(item);
            if (ModelState.IsValid)
            {
                context.Entry(item).State = System.Data.Entity.EntityState.Modified;
                context.SaveChanges();

            }
        }