คำถามเกี่ยวกับการออกแบบการปรับใช้หน้าปัจจุบัน


12

ฉันได้ตรวจสอบการแบ่งหน้าใน asp.net mvc โดยเฉพาะและฉันรู้สึกว่ามีบางสิ่งบางอย่างที่มีประสิทธิภาพน้อยกว่าในการใช้งาน

ประการแรกการใช้งานทั้งหมดใช้ค่าเลขหน้าดังนี้

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

สิ่งที่ฉันรู้สึกผิดคือ pageIndex และ pageSize ทั้งหมดควรเป็นสมาชิกของคลาส Pagination มิฉะนั้นวิธีนี้จะดูมีประโยชน์มาก นอกจากนี้ยังช่วยลดความยุ่งยากของพารามิเตอร์ที่ไม่จำเป็นในการใช้งาน

สิ่งที่สองคือพวกเขาใช้ด้านล่างส่วนต่อประสาน

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    int PageNumber { get; }
    int PageSize { get; }
    bool HasPreviousPage { get; }
    bool HasNextPage { get; }
    bool IsFirstPage { get; }
    bool IsLastPage { get; }
} 

ถ้าฉันต้องการที่จะกำหนดเส้นทางการให้เลขหน้าของฉันไปที่การกระทำที่แตกต่างกันดังนั้นฉันต้องสร้างรูปแบบมุมมองใหม่สำหรับใส่ชื่อการกระทำในแค็ปซูลหรือแม้แต่ชื่อคอนโทรลเลอร์ อีกวิธีหนึ่งคือการส่งโมเดลที่เชื่อมต่อนี้เพื่อดูจากนั้นระบุการกระทำและตัวควบคุมฮาร์ดโค้ดในเมธอดเพจเจอร์เป็นพารามิเตอร์ แต่ฉันสูญเสียการใช้งานมุมมองของฉันอีกครั้งโดยสิ้นเชิงเพราะมันขึ้นอยู่กับการกระทำเพียงอย่างเดียว

อีกสิ่งหนึ่งคือพวกเขาใช้รหัสด้านล่างในมุมมอง

Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)

หากรูปแบบคือ IPagedList ว่าทำไมพวกเขาไม่ได้ให้วิธีการเกินเหมือนหรือดียิ่งขึ้นอย่างใดอย่างหนึ่งคือ@Html.Pager(Model) @Html.Pager()คุณรู้ว่าเรารู้รูปแบบประเภทด้วยวิธีนี้ ก่อนที่ฉันจะทำผิดพลาดเพราะฉันใช้ Model.PageIndex แทน Model.PageNumber

อีกประเด็นใหญ่คือพวกเขาพึ่งพาอินเตอร์เฟซ IQueryable อย่างยิ่ง พวกเขารู้ได้อย่างไรว่าฉันใช้ IQueryable ในชั้นข้อมูลของฉัน ฉันคาดหวังว่าพวกเขาจะทำงานกับคอลเลกชันที่ทำให้การใช้งานคงอยู่ไม่รู้ลืม

มีอะไรผิดปกติเกี่ยวกับแนวคิดการปรับปรุงของฉันเกี่ยวกับการใช้เลขหน้าของพวกเขา อะไรคือเหตุผลของพวกเขาที่จะไม่ใช้การแบ่งหน้าด้วยวิธีนี้?


มันค่อนข้างซับซ้อนสำหรับฉัน ไม่ใช่ว่าฉันค่อนข้างเข้าใจว่าปัญหาคืออะไร แต่ ... คุณจำเป็นต้องใช้ผู้ช่วยเหลือที่มีอยู่แล้วหรือไม่ ฉันไม่รู้ด้วยซ้ำว่าพวกเขามีวิทยุติดตามตัว ฉันได้พัฒนาคอลเลกชันของผู้ช่วยเหลือของตัวเองตั้งแต่วันที่ MVC 1 Beta หลังจากความพยายามครั้งแรกของฉัน (และล้มเหลว) ในการติดต่อกับผู้ช่วยเหลือในตัว ฉันแนะนำเช่นเดียวกันกับคุณ หากคุณกำลังดิ้นรนกับผู้ช่วยเหลือเหล่านั้นก็ไม่ได้ดีไปกว่า WebForms ที่คุณต้องดิ้นรนกับการควบคุมเซิร์ฟเวอร์

ASP.NET MVC ไม่มีตัวช่วยการให้เลขหน้าในตัวเพียงแค่มีการแบ่งหน้าบุคคลที่สาม
Freshblood

ขอบคุณสำหรับข้อมูลนั้น คำถามคือทำไมคุณต้องมี มันไม่มีความพยายามที่จะใช้มันด้วยตัวคุณเองเหมือนที่คุณต้องการ

ฉันแค่อยากจะรู้ว่ามีบางอย่างผิดปกติเกี่ยวกับความคิดของฉัน ฉันไม่ทำลายหลักการพื้นฐานบางอย่างถ้าไม่ได้ดังนั้นทำไมทั้งหมดของพวกเขาตามการออกแบบเดียวกันในการใช้งานของพวกเขา .. ฉันไม่ได้รับมัน
Freshblood

หากรหัสไม่สามารถแก้ปัญหาของโปรแกรมเมอร์ได้รหัสก็ไม่มีค่าคุณควรหลีกเลี่ยงการใช้มัน
Shaheer

คำตอบ:


1

ตามที่ผู้ใช้ระบุไว้ 8586: อินเทอร์เฟซของคุณดูเหมือนจะซ้ำซ้อนกับข้อมูลและหลักการ MVC ที่มีอยู่

ลองสิ่งนี้: ข้อมูลที่คุณต้องการจาก IPagedList เช่นดัชนีหน้า ฯลฯ ควรนำไปใช้ในเลเยอร์ตรรกะทางธุรกิจและส่งไปยังมุมมอง / หน้าผ่านโมเดลทั่วไปที่สามารถป้อนกลับไปที่เซิร์ฟเวอร์และส่งและประมวลผลอย่างปลอดภัย ทำไม? เนื่องจากสิ่งที่คุณกำลังรวบรวมที่นี่ชัดเจนคือการป้อนข้อมูลไปยังระบบข้อมูลของคุณและเป็นของเลเยอร์ที่ต่ำกว่า UI

วิธีนี้อาจไม่ใช่วิธีที่ดีที่สุดที่จะไปและไม่ใช่วิธีที่เร็วที่สุด แต่ควรทำให้ง่ายขึ้นที่จะเห็นสิ่งที่คุณต้องการในแง่ของนามธรรมและสถาปัตยกรรมข้อมูลและช่วยให้คุณลบความซ้ำซ้อน

นอกจากนี้ผู้ช่วยเหลือที่มีอยู่มักจะมีค่าใช้จ่ายมากเกินไปสำหรับการใช้งานที่ง่ายและบางครั้งทำให้ภาพใหญ่สับสน


0

ยังไม่ได้ใช้ IPagedList หรือตัวช่วย แต่นี่คือสิ่งที่ฉันต้องทำ:

นี่MostPopular(int pageIndex,int pageSize)คืออินเทอร์เฟซที่ระบุอย่างชัดเจน: ฉันจะแสดงหน้าสิ่ง MostPopular เท่านั้น คุณบอกฉันอย่างชัดเจนว่าหน้าไหนและขนาดไหน

หากพวกเขาสร้างวิธีการควบคุมMostPopular(IPagedList<T> page)อินเทอร์เฟซจะสับสนมากขึ้น คุณบอกผู้ควบคุมจำนวนรวมของรายการหรือไม่?

เมื่อคอนโทรลเลอร์ทำการดึงข้อมูลเพจที่ระบุเฉพาะของคุณโดยทั่วไปแล้วจะสามารถค้นพบข้อมูลอื่น ๆ เช่นจำนวนไอเท็มที่มีทั้งหมด ณ จุดนี้มันสมเหตุสมผลแล้วที่จะคืนค่าข้อมูลดังกล่าวไปยังมุมมองดังนั้นจึงสามารถเลือกใช้บางส่วนได้

นี้ไม่ได้หมายความว่า IPagedList เป็นรุ่นมันก็เช่นกันอาจจะเป็นส่วนหนึ่งของรูปแบบ (ทรัพย์สินในนั้น) นี่น่าจะเป็นเหตุผลที่ไม่มีการโอเวอร์โหลดที่ไม่มีพารามิเตอร์

พวกเขาสามารถเพิ่ม IPagedList เป็นโอเวอร์โหลดได้ แต่จากนั้นคุณจะส่งชุดข้อมูล (เพจจิ้งของข้อมูล) ไปยังผู้ช่วยเพจเจอร์เล็ก ๆ ที่ไม่ต้องการข้อมูลจริง เพียงต้องการทราบจำนวนหน้า / รายการและที่คุณอยู่ในขณะนี้เพื่อให้สามารถเน้นหมายเลขหน้าและเช่น คุณจะบอกผู้ช่วยได้มากขึ้นจากนั้นจำเป็นต้องรู้ว่าจะทำอะไรได้บ้าง วิธีการทำงานในขณะนี้มีข้อต่อที่ต่ำกว่าซึ่งเป็นสิ่งที่ดี


ฉันแค่อยากจะบอกว่าพารามิเตอร์วิธีการดำเนินการอาจเป็นวัตถุที่มีคุณสมบัติชื่อ PageIndex และ PageSize ดังนั้นด้วยวิธีนี้เราสามารถตรวจสอบรูปแบบได้อย่างง่ายดายเพราะมีใครบางคนสามารถผลักขนาดหน้าขนาดใหญ่เพื่อโจมตีประสิทธิภาพของเซิร์ฟเวอร์ และหากพวกเขาจะให้การโอเวอร์โหลดแบบไม่มีพารามิเตอร์ดังนั้นการโอเวอร์โหลดแบบไม่มีพารามิเตอร์จะสามารถใช้งานได้เมื่อโมเดลคือ IPagedList ไม่มีอะไรผิดปกติถ้าฉันส่งข้อมูลเพิ่มเติมผู้ช่วยต้องการ ไม่มีเช่นกฎที่เข้มงวดเป็นแนวปฏิบัติที่ดีที่สุด
Freshblood

0

ระบุว่าสิ่งที่ลูกค้าขอหมายเลขหน้าและสิ่งที่ลูกค้ามักจะแตกต่างกันคือขนาดหน้าฉันคิดว่า:

public ActionResult MostPopulars(int pageIndex,int pageSize)

เป็นวิธีที่สมเหตุสมผลในการทำสิ่งนี้ ฉันได้เห็นรูปแบบต่าง ๆ ที่ใช้จำนวน (ก่อนถัดไปก่อนหน้าสุดท้าย) แต่จริงๆแล้วมันเป็นเพียงวิธีที่น่าอึดอัดใจในการพูดว่า "pageIndex"

ฉันจะย้ำว่าขนาดหน้าจะและควรจะแตกต่างกันมากขึ้นอยู่กับผู้ชมที่เกี่ยวข้องคุณควรได้รับค่าเริ่มต้นที่แตกต่างกันสำหรับโทรศัพท์มือถือแบบพกพาและเวิร์คสเตชั่นหน้าจอขนาดใหญ่รวมถึงในหลายกรณี หน้า

ฉันรู้ว่าผลลัพธ์นี้มีพารามิเตอร์จำนวนมากส่งผ่านภายในกรอบ MVC แต่แนวคิดทั้งหมดของการแบ่งเพจ MVC - ตรรกะทางธุรกิจของคุณจำเป็นต้องรู้เกี่ยวกับการนำเสนอเพื่อให้เพจใช้งานได้มันจะยุ่งเหยิงเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.