IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: ASP.NET MVC redukce duplicitního controlleru

Aktivity
Avatar
Fenrix
Člen
Avatar
Fenrix:24.12.2017 11:02

ahoj, chtěl bych poprosit o drobnou radu. Mám stránku s feedem příspěvků (jako fb) takže statusy + komentáře ke statusům. následně chci stejně jako je na fb udělat profilovou sekci, takže uplně to stejný jako feed, s rozdílem, že se budou zobrazovat jen příspěvky toho jednoho člověka.
Controller vypadá takto:

public class HomeController : Controller
    {
        private UserManager<ApplicationUser> UserManager { get; set; }
        private ApplicationDbContext db = new ApplicationDbContext();
        public ActionResult Index()
        {
            return View();
        }
        // GET: Post
        public PartialViewResult _PartialIndex()
        {
            var newPosts = db.Posts.OrderByDescending(p => p.post_ID);

            return PartialView(newPosts);
        }

        // GET: Post/Create


        // POST: Post/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index([Bind(Include = "post_ID,post_txt,post_date, post_author")] Post post)
        {
            if (ModelState.IsValid)
            {
                string PostAuthor = HttpContext.GetOwinContext()
                 .GetUserManager<ApplicationUserManager>()
                 .FindById(User.Identity.GetUserId()).NickName;
                post.post_author = PostAuthor;
                post.post_date = DateTime.Now;
                db.Posts.Add(post);
                db.SaveChanges();

            }

            return View();
        }


        // GET: Post/Comments/5
        public ActionResult Comments(int? id)
        {
            PostCommentVM postCommentVM = new PostCommentVM();
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            postCommentVM.post = db.Posts.Find(id);
            if (postCommentVM.post == null)
            {
                return HttpNotFound();
            }
            return View(postCommentVM);
        }

        public PartialViewResult _PartialComments(int id)
        {
          var newComments = db.Comments.Include("Posts").Where(c => c.post_ID == id).OrderByDescending(c => c.Comm_ID);

           // var newComments = db.Comments.OrderByDescending(c => c.Comm_ID);


            return PartialView(newComments);
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Comments([Bind(Include = "Comm_ID, Comm_Txt, Comm_Author")] Comment comment, int id)
        {
            PostCommentVM postCommentVM = new PostCommentVM();

            if (ModelState.IsValid)
            {
                // postCommentVM.comment.Comm_Date = DateTime.Now;
                  string CommAuthor = HttpContext.GetOwinContext()
                     .GetUserManager<ApplicationUserManager>()
                     .FindById(User.Identity.GetUserId()).NickName;
                     comment.Comm_author = CommAuthor;
                comment.post_ID = id;
                db.Comments.Add(comment);
                db.SaveChanges();

            }
            //
            // komentují se všechny statusy, ne jen jeden konkrétní
            //
            return RedirectToAction("Comments");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

a jde mi o to, když bych založil ProfileController, zda existuje možnost jak použít kod z homecontrolleru, protože mi přijde už takový ošklivý ten stejnej kod překopírovat do profilecontrolleru a udělat jen drobnou změnu na zobrazování příspěvků jednoho člověka.
A další drobná věc: ve Views to už asi zredukovat nepůjde, že? opět mi přijde ošklivý mít zas další views a partial views na to stejný, jen s jinym layoutem
předem díky :)

 
Odpovědět
24.12.2017 11:02
Avatar
xpoproci
Člen
Avatar
xpoproci:24.12.2017 12:09

Pri controllery sa to určite dá. Stačí si napísať nejaký abstraktný controller nejako takto.

public abstract class FooController : Controller{
        //metódy, ktoré chceš využiť viac krát napr.
        public virtual ActionResult Comments(int? id){
                //logika
        }
}

a potom to použiješ takto.

public class HomeController: FooController{
        //automaticky obsahuje metódu Comments
}

pri tých views by sa to dalo asi len cez tie partialy. a z nich si vyskladáš čo kde potrebuješ dať.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.12.2017 12:09
Motto
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.