วิธีการส่งข้อมูลไปยัง Master Page (โดยใช้ ASP.NET MVC) โดยไม่ผิดกฎ MVC คืออะไร?
โดยส่วนตัวแล้วฉันชอบโค้ด abstract controller (ตัวควบคุมฐาน) หรือคลาสพื้นฐานซึ่งส่งผ่านไปยังมุมมองทั้งหมด
วิธีการส่งข้อมูลไปยัง Master Page (โดยใช้ ASP.NET MVC) โดยไม่ผิดกฎ MVC คืออะไร?
โดยส่วนตัวแล้วฉันชอบโค้ด abstract controller (ตัวควบคุมฐาน) หรือคลาสพื้นฐานซึ่งส่งผ่านไปยังมุมมองทั้งหมด
คำตอบ:
หากคุณต้องการให้มุมมองของคุณมีคลาสข้อมูลมุมมองที่พิมพ์มากสิ่งนี้อาจเหมาะกับคุณ วิธีแก้ปัญหาอื่น ๆ น่าจะถูกต้องกว่าแต่นี่เป็นความสมดุลที่ดีระหว่างการออกแบบและการใช้งานจริง IMHO
หน้าต้นแบบใช้คลาสข้อมูลมุมมองที่พิมพ์อย่างรุนแรงซึ่งมีเฉพาะข้อมูลที่เกี่ยวข้องเท่านั้น:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
แต่ละมุมมองที่ใช้หน้าต้นแบบนั้นจะใช้คลาสข้อมูลมุมมองที่พิมพ์อย่างรุนแรงซึ่งมีข้อมูลและได้มาจากข้อมูลมุมมองของหน้าต้นแบบ
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
เนื่องจากฉันไม่ต้องการให้ตัวควบคุมแต่ละตัวรู้อะไรเกี่ยวกับการรวบรวมข้อมูลหน้าต้นแบบฉันจึงรวมตรรกะนั้นไว้ในโรงงานซึ่งส่งผ่านไปยังคอนโทรลเลอร์แต่ละตัว:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
การสืบทอดตรงกับต้นแบบเพื่อดูความสัมพันธ์ได้ดี แต่เมื่อพูดถึงการแสดงผลบางส่วน / การควบคุมผู้ใช้ฉันจะเขียนข้อมูลมุมมองของพวกเขาลงในข้อมูลการดูหน้าเว็บเช่น
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
นี่เป็นโค้ดตัวอย่างเท่านั้นและไม่ได้มีไว้เพื่อคอมไพล์ตามที่เป็นอยู่ ออกแบบมาสำหรับ ASP.Net MVC 1.0
ฉันชอบที่จะหมดออกชิ้นที่ขับเคลื่อนด้วยข้อมูลของมุมมองต้นแบบที่เข้า partials และการแสดงผลโดยใช้Html.RenderAction สิ่งนี้มีข้อดีที่แตกต่างกันหลายประการเหนือวิธีการสืบทอดโมเดลมุมมองยอดนิยม
แก้ไข
Generic Errorให้คำตอบที่ดีกว่าด้านล่าง โปรดอ่าน!
คำตอบเดิม
Microsoft ได้โพสต์ข้อความเกี่ยวกับวิธีจัดการนี้อย่างเป็นทางการ สิ่งนี้ให้คำแนะนำทีละขั้นตอนพร้อมคำอธิบายเหตุผลของพวกเขา
ในระยะสั้นพวกเขาแนะนำให้ใช้คลาสคอนโทรลเลอร์นามธรรม แต่ดูด้วยตัวคุณเอง
ตัวควบคุมนามธรรมเป็นความคิดที่ดีและฉันยังไม่พบวิธีที่ดีกว่านี้ ฉันสนใจที่จะดูว่าคนอื่น ๆ ทำอะไรเช่นกัน
ฉันได้ทำการค้นคว้าและเจอทั้งสองไซต์นี้ บางทีพวกเขาอาจช่วยได้
ASP.NET MVC Tip # 31 - การส่งผ่านข้อมูลไปยัง Master Pages และ User Controls
ฉันพบว่าพาเรนต์ทั่วไปสำหรับอ็อบเจ็กต์โมเดลทั้งหมดที่คุณส่งผ่านไปยังมุมมองนั้นมีประโยชน์อย่างยิ่ง
มักจะมีคุณสมบัติของโมเดลทั่วไประหว่างเพจอยู่ดี
วัตถุ Request.Params ไม่แน่นอน การเพิ่มค่าสเกลาร์เป็นส่วนหนึ่งของวงจรการประมวลผลคำขอนั้นค่อนข้างง่าย จากมุมมองของมุมมองข้อมูลนั้นอาจถูกจัดเตรียมไว้ใน QueryString หรือ FORM POST hth
ฉันคิดว่าวิธีที่ดีอีกวิธีหนึ่งคือการสร้างอินเทอร์เฟซสำหรับมุมมองกับคุณสมบัติบางอย่างเช่น ParentView ของอินเทอร์เฟซบางอย่างเพื่อให้คุณสามารถใช้ทั้งสองอย่างสำหรับการควบคุมที่ต้องการการอ้างอิงไปยังเพจ (การควบคุมหลัก) และสำหรับมุมมองหลักซึ่งควรเข้าถึงได้จาก มุมมอง
โซลูชันอื่น ๆ ขาดความสง่างามและใช้เวลานานเกินไป ฉันขอโทษที่ทำสิ่งที่น่าเศร้าและสิ้นหวังเกือบตลอดทั้งปีต่อมา:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
เห็นได้ชัดว่าฉันมีเมธอด Get () แบบคงที่นี้บน SiteMasterViewData ที่ส่งคืน SiteMasterViewData