Valor que aparece como nulo aunque asigné valor en el controlador

Estoy tratando de hacer algún tipo de declaración condicional para calcular un valor. Para simular mis datos, estoy asignando el valor en mi controlador (temporalmente) para ver cómo va mi interfaz de usuario. Puedo realizar el cálculo en un bloque de funciones en la vista, pero es largo y no pertenece allí. Entonces, ahora estoy tratando de hacer el cálculo en un modelo (Calculations.cs).

El código para el cálculo funciona porque se pasa un valor, excepto que mi condición falla y pasa el valor predeterminado de 0 cuando debería pasar otro valor basado en mi valor simulado en el controlador.

Aquí está la Calculations.cs

public class Calculations
{
    PriceQuote price = new PriceQuote();
    StepFilingInformation filing = new StepFilingInformation();
    public decimal Chapter7Calculation
    {
        get
        {
            return
                price.priceChapter7
                +
                ((ReferenceEquals
                    (filing.PaymentPlanRadioButton,
                    Models.StepFilingInformation.PaymentPlan.Yes))
                ?
                price.pricePaymentPlanChapter7
                :
                0);
        }

    }
}

Originalmente tuve (filing.PaymentPlanRadioButton == Models.StepFilingInformation.PaymentPlan.Yes) verificando si el botón de radio estaba o no configurado en "Sí", pero lo cambió a ReferenceEquals. Esto no afecta el resultado.

Tengo mi controlador asignando el valor a PaymentPlanRadioButton a "Sí", entonces pricePaymentPlanChapter7 debe ser el valor que se agrega a priceChapter7, pero no lo es. En su lugar, se agrega "0" como respaldo a la condición. Entonces PaymentPlanRadioButton es nulo aunque lo estoy asignando en el controlador.

No puedo averiguar cómo arreglar esto. Si lo asigno en el modelo y hago que funcione, eso no resolverá el problema, ya que cuando elimino el controlador simulado y espero que un usuario elija un botón de opción, seguirá siendo null y la condición fallará.

Aquí está el controlador "simulado":

public class QuoteMailerController : Controller
{
    public ActionResult EMailQuote()
    {
        Calculations calc = new Calculations();
        var total = calc.Chapter7Calculation;

        QuoteData quoteData = new QuoteData
        {
            StepFilingInformation = new Models.StepFilingInformation
            {
                //"No" is commented out, so "Yes" is assigned
                //PaymentPlanRadioButton = 
                    //Models.StepFilingInformation.PaymentPlan.No,
                PaymentPlanRadioButton = 
                    Models.StepFilingInformation.PaymentPlan.Yes,
            }
         };
    }
}

Y aquí es donde guardo los precios (PriceQuote.cs):

public class PriceQuote
{
    public decimal priceChapter7 { get { return 799; } }
    public decimal pricePaymentPlanChapter7 { get { return 100; } }
}

Este es mi ViewModel:

public class QuoteData
{
    public PriceQuote priceQuote;
    public Calculations calculations;
    public StepFilingInformation stepFilingInformation { get; set; }
    public QuoteData()
    {
        PriceQuote = new PriceQuote();
        Calculations = new Calculations();
    }
}

Entonces, la forma en que esto debería funcionar es 799 + 100 = 899, ya que PaymentPlan.Yes se asigna como valor al botón de radio en el controlador. Pero en su lugar obtengo solo 799 (799 + 0) porque cuando depuro PaymentPlanRadioButton está resultando nulo.

¿Alguna idea/orientación?

Por si acaso, aquí está el PaymentPlanRadioButton ubicado dentro de StepFilingInformation.cs (y es uno de mis modelos):

public enum PaymentPlan
{
    No,
    Yes
}
public class PaymentPlanSelectorAttribute : SelectorAttribute
{
    public override IEnumerable<SelectListItem> GetItems()
    {
        return Selector.GetItemsFromEnum<PaymentPlan>();
    }
}       
[PaymentPlanSelector(BulkSelectionThreshold = 3)]
public PaymentPlan? PaymentPlanRadioButton { get; set; }

Lo siento por la longitud.

preguntado el 22 de mayo de 12 a las 19:05

1 Respuestas

Su clase de Cálculos basa su matemática en el objeto StepFilingInformation que contiene. Sin embargo, nunca establece StepFilingInformation desde dentro de Calculations en otra cosa que no sea un objeto nuevo y vacío.

Su constructor probablemente debería requerir un parámetro de tipo StepFilingInformation.

public class Calculations
{
    StepFilingInformation filing;
    public Calculations(StepFilingInformation filing)
    {
       this.filing = filing;
    } 

Independientemente de cómo pase a su clase de cálculos una referencia a StepFilingInformation, debe establecer este valor antes ejecutas tu cálculo que depende de ello.

Además, si QuoteData es su ViewModel, entonces no debería contener una referencia a su clase de Cálculos. Solo debe contener resultados creados en la clase de cálculos que debe mostrar la Vista.

StepFilingInformation filing = new Models.StepFilingInformation
{
    PaymentPlanRadioButton = Models.StepFilingInformation.PaymentPlan.Yes,
};

Calculations calc = new Calculations(filing);
var total = calc.Chapter7Calculation;

QuoteData quoteData = new QuoteData //Only include Properties you're going to display in the view model
{
    Total = total
};

contestado el 22 de mayo de 12 a las 21:05

Ese último bloque de código es lo que hay en mi controlador. Entonces el StepFilingInformation filing.... (primeras 4 líneas del segundo bloque) está realmente dentro QuoteData quoteData = new QuoteData... en mi controlador simulado. - REMESQ

Si, lo ví. Su controlador simulado crea una instancia de clase de cálculo, calcula el total sin configurar nunca el archivo con la clase de cálculo, luego establece una segunda instancia de archivo que tiene los datos correctos dentro de QuoteData después de que finaliza el cálculo. - DMulligan

Veo lo que estás diciendo. estaba probando el Calculations y var total al final después de QuoteData quoteData pero eso no estaba funcionando. En cualquier caso, el verdadero problema era que tenía StepFilingInformation dentro QuoteData. Ok, pero ahora, ¿de dónde sacaste Total = total de, porque VS se queja de que QuoteData no contiene una definición de "Total"? - REMESQ

Ese fue solo un ejemplo de lo que probablemente pondría en su ViewModel. Mi punto era solo que las clases que tiene actualmente en su ViewModel no creo que pertenezcan allí. En mi ejemplo, Total sería una propiedad decimal en QuoteData (porque si está calculando el total en esa acción, presumiblemente desea mostrarlo). - DMulligan

Entendido. Gracias por la información/ayuda - REMESQ

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.