El método de extensión EditorFor
conecta su modelo al PartialView que se encuentra en el archivo EditorTemplates que corresponde al tipo del modelo (por lo que en este caso necesitaría ser Boolean.cshtml
).
Puede lograr su objetivo agregando lógica condicional a la plantilla del editor. También deberá dar al parcial una forma de saber qué valor tiene la propiedad MoreInstructorsAllowed
, y puede usar la sobrecarga EditorFor
con el parámetro additionalViewData
para pasar esta información.
Honestamente, cambiar la funcionalidad por defecto del procesamiento booleanos parece ser un poco demasiado para lo que estás tratando de hacer. Si estos dos campos están fundamentalmente vinculados, tendría más sentido hacer un compuesto de los dos campos y conectar una vista parcial al compuesto en lugar de a los booleanos mismos. Lo que quiero decir es:
public class InstructorProperty {
public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }
}
y en /Shared/EditorTemplates/InstructorProperty.cshtml
@model InstructorProperty
// ... Your view logic w/ the @if(MoreInstructorsClause) here.
El único problema es que ahora que están de vuelta en el problema de tener que utilizar el método CheckboxFor
para aplicar el atributo "deshabilitado", porque los métodos EditorFor
no aceptan atributos html ad hoc. Existe una solución conocida que implica anular su ModelMetadataProvider
y decorar la propiedad con un atributo que usted proporciona en el ModelMetadataProvider. Un ejemplo de trabajo de esta técnica está disponible en: http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-2D00-ASP.Net-MVC-2.0-Beta_2D00_1.aspx. Sin embargo, eso todavía implicará: (1) anular la vista booleana y codificar el html o usar CheckboxFor, (2) usando el método CheckboxFor
en la vista InstructorProperty
, o (3) codificar el html en la vista InstructorProperty
. No creo que tiene sentido para complicar más el diseño para una cosa tan trivial, así que mi solución sería utilizar esta vista InstructorProperty
y sólo tiene que añadir:
@Html.CheckboxFor(_=>_.IsInstructor,
htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"}).ToString().ToLowerInvariant() });
Pero conseguir que cada uno tiene diferentes estilos ... Otra nota al margen Si su aversión al uso del método Checkbox está relacionada con el esquema de nombres generado, la forma en que el Mvc Framework accede a esta característica implica html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)
Vi una solución en http://stackoverflow.com/questions/6590663/make-checkbox -disabled-in-asp-net-mvc-2-and-jquery, pero quiero usar EditorFor en lugar de CheckBoxFor –