2012-06-06 44 views
5

Estoy trabajando en ASP.NET MVC3 usando Razor. Tengo una situación en la que deseo habilitar la desactivación de una casilla de verificación basada en una propiedad booleana. Mi clase del modelo tiene 2 propiedades como:ASP.NET MVC3 @ Html.EditorFor Checkbox disable enable

public bool IsInstructor { get; set; } 
public bool MoreInstructorsAllowed { get; set; } 

Ahora en mi archivo cshtml, estoy mostrando la casilla de verificación como:

@Html.EditorFor(model => model.IsInstructor) 

Quiero que esta casilla de verificación para habilitar bloquear en base a la propiedad MoreInstructorsAllowed. Gracias de antemano por la solución. :)

+0

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 –

Respuesta

3

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)

+0

muchas gracias por esta respuesta detallada, pero si utilizamos CheckboxFor, que la propiedad MoreInstructorsAllowed tendrá que ser de cadena? como el atributo deshabilitado no puede ser verdadero o falso, se puede deshabilitar y habilitar. –

+0

Eso es correcto. He revisado mi respuesta. – smartcaveman