سؤال

وأنا أتساءل فقط، إذا بتحريك مجمع إذا كانت تصريحات شيء آخر وما ينجم عنها من علامات HTML إلى رمز ينتهك القانون وراء بعض 'MVC؟

ويبدو أن خيار كبير عندما تواجه مع مضمنة إذا كانت تصريحات شيء آخر يمكن أن تصبح غير قابلة للقراءة للغاية.

هل كانت مفيدة؟

المحلول

وأنا أفضل عدم استخدام التعليمات البرمجية خلف فئة في وجهات نظري. هذا ليس لأنه ينتهك MVC افتراضيا، ولكن لأنني وجدت أن الطريقة "الطبيعية" (على الأقل بالنسبة لي) مختلفة.

عند أواجه ترميز HTML المعقدة التي تتعلق عرض بحتة المخاوف، وأنا أكتب عادة طريقة تمديد لفئة HtmlHelper من أجل إخفاء التعقيد. وبالتالي لدي ملحقات مثل Html.MoneyTextBox()، Html.OptionGroup() وHtml.Pager<T>.

في حالات أخرى عندما تنشأ الظروف المعقدة، وعادة ما فاتني شيء من وحدة تحكم. على سبيل المثال، كل القضايا المتعلقة الرؤية، للقراءة فقط أو تمكين العناصر عادة ما تنبع من شيء أن وحدة تحكم يمكن أن تقدم. في هذه الحالة بدلا من تمرير النموذج إلى العرض، وخلق نموذج الرأي الذي يغلف نموذج والمعلومات الإضافية التي يمكن أن توفر تحكم من أجل تبسيط ترميز HTML. والمثال النموذجي لنموذج الرأي ما يلي:

public class CustomerInfo
{
  public Customer Customer { get; set; }
  public bool IsEditable { get; set; }  // e.g. based on current user/role
  public bool NeedFullAddress { get; set; }  // e.g. based on requested action 
  public bool IsEligibleForSomething { get; set; }  // e.g. based on business rule
} 

وقال ذلك، هو رمز وراء جزء من رأي، لذلك يمكنك استخدامه بحرية، ما اذا كان يناسب احتياجاتك بشكل أفضل.

نصائح أخرى

وانها ليست فظيع أن يكون الشرطية في وجهة نظركم. وأود أن الاحتفاظ بها في ASPX لا رمز خلف. ومع ذلك، غالبا ما يشير مشروطة السلوك المسيطر. النظر في التعليمات البرمجية ASPX التالية:

<%if (ViewData["something"] == "foo") {%>
     <%=Html.ActionLink("Save", "Save") %> 
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
     <%=Html.ActionLink("Delete", "Delete") %> 
<%}%>

وهذه المجموعة من الشرطية يمثل السيطرة على السلوك الذي يتم التعامل معها من قبل الرأي - أي في المكان الخطأ. هذا السلوك ليس وحدة قابلة للاختبار. النظر بدلا من ذلك:

<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
     <%=Html.ActionLink(command) %>
<%}%>

في هذا المثال ActionLink هو امتداد مخصصة للHtmlHelper أن يأخذ منطقتنا ICommand الكائن المواصفات. العمل تحكم أن يجعل هذا الرأي بملء ViewData [ "الأوامر"] على أساس ظروف مختلفة. وبعبارة أخرى، وحدة تحكم يفعل السيطرة. في وحدة الاختبارات لهذا الإجراء، يمكننا اختبار أن مجموعة الصحيح من الأوامر ستعرض في ظل ظروف مختلفة.

في البداية قد يبدو هذا وكأنه المتاعب مقارنة مع إلقاء بعض الاتحادات الدولية بسرعة في طريقة العرض. السؤال عليك أن تسأل نفسك هو: "هل هذا IF تمثل السلوك المسيطر، وأريد أن ضمان لا في بعض كسر النقطة؟"

وأعتقد طالما انها رمز تقديم وأنه كان "عرض" ليست في وحدة تحكم، ثم وضعه على التعليمات البرمجية خلف أو مضمنة لن يهم. فقط للتأكد من أنك لا تكتب هذه القطعة من رمز التقديم في إجراءات تحكم (بهذه الطريقة سوف تنتهك حقا نمط MVC).

ووcodebehind هو جزء من مشاهدة - والامر متروك لك إذا كنت تريد أن تضع الأمور في ASPX مباشرة أو في codebehind. MVC لا يعني أن عليك أن رمز كل الأشياء القبيحة في ASPX:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top