Intentando devolver una consulta List Linq a MVC3 View obteniendo el error "tiene algunos argumentos no válidos"
Frecuentes
Visto 2,910 equipos
0
Tengo una clase llamada Propiedad de la que solo necesito mostrar algunos elementos en mi vista de Lista. Creé una consulta de Linq para devolver solo esos elementos en el método de índice de mi controlador. yo he instanciado
List<Property> props = new List<Property>();
dentro del método Index del controlador, pero cuando trato de "Agregar" al accesorios lista "props.Add(getProp);" Estoy recibiendo este error:
"La mejor coincidencia de método sobrecargado para System.Collections.Generic.List<PropertyEntities.Property>.Add(PropertyEntities.Property)
tiene algunos argumentos inválidos"
He incluido el método de índice PropertyControler y la clase de propiedad con la que estoy trabajando a continuación:
public ViewResult Index()
{
//var properties = db.Properties.Include(p => p.PropertyType);
var getProp = from p in db.Properties
orderby p.PropName
select new
{
p.PropertyID,
p.PropName,
p.PropertyStatus,
p.City,
p.State,
p.Bedrooms,
p.PropertyType
};
List<Property> props = new List<Property>();
props.Add(getProp);
return View(props);
}
public partial class Property
{
//public int temp { get; set; }
// Values stored in the view Garage DropDownList
public enum GarageType{ None = 0, One = 1, Two = 2, Three = 3, Four = 4, Carport = 5, Other = 6 }
public enum PropertyStatusType { Leased = 0, Available = 1, Selling = 2, Sold = 4 }
[Required]
[ScaffoldColumn(false)]
public int PropertyID { get; set; }
[Required(ErrorMessage="Generic name for referencing."),
StringLength(30, ErrorMessage = "Property name max length is 30 characters."),
Display(Name="Property Name", Prompt="Enter Property Name")]
public string PropName { get; set; }
[Required(ErrorMessage="Select a status for this property."),
Display(Name="Property Status")]
public int PropertyStatus { get; set; }
// used in corolation with the property PropertyStatus
// to allow dropdown list to except Enum values
// PropertyStatusType
public PropertyStatusType PropertyEnumStatus
{
get { return (PropertyStatusType)PropertyStatus; }
set { PropertyStatus = (int)value; }
}
[Required(ErrorMessage="Select a property type.")]
public int PropertyTypeId { get; set; }
[Required(ErrorMessage="Address is required."),
StringLength(75, ErrorMessage="Address max length is 75 characters.")]
public string Address { get; set; }
[Required(ErrorMessage = "City name is required."),
StringLength(25, ErrorMessage = "City max length is 25 characters.")]
public string City { get; set; }
[Required(ErrorMessage = "State abbreviation is required."),
StringLength(2, ErrorMessage = "State max length is 2 characters.")]
public string State { get; set; }
[Required(ErrorMessage = "Zip Code is required."),
StringLength(5, ErrorMessage = "Zip Code max length is 5 numbers."),
Range(00001, 99999)]
[Display(Name="Zip Code")]
public string ZipCode { get; set; }
[Required(ErrorMessage="Square feet is required."),
Display(Name="Square Feet")]
public int SquareFeet { get; set; }
[Required(ErrorMessage = "Number of bedrooms is required."),
Range(0,10)]
public int Bedrooms { get; set; }
[Required(ErrorMessage="Number of bathrooms is required."),
Range(0,20)]
public int Bathrooms { get; set; }
public int Garage { get; set; }
// used in corolation with the property Garage
// to allow dropdown list to except Enum values
// of GarageType
[NotMapped]
public GarageType GarageEnumValue
{
get { return (GarageType)Garage; }
set{ Garage = (int)value; }
}
[Display(Name="Morgage Amount"),
Range(0.00, 100000000.00)]
public Nullable<decimal> MonthlyMortgage { get; set; }
[Display(Name="HOA Dues"),
Range(0.00, 1000.00)]
public Nullable<decimal> HousingDues { get; set; }
[Display(Name="Property Tax"),
Range(0.0, 100000000.00)]
public Nullable<decimal> Tax { get; set; }
[Display(Name="Property Insurance"),
Range(0.0, 100000000.00)]
public Nullable<decimal> Insurance { get; set; }
[Display(Name="Assessed Value"),
Range(0.0, 100000000.00)]
public Nullable<decimal> AssessedValue { get; set; }
[Display(Name="Current Value"),
Range(0.0, 100000000.00)]
public Nullable<decimal> CurrentValue { get; set; }
[DataType(DataType.MultilineText)]
[StringLength(500, ErrorMessage="You have reached the allotted 500 characters.")]
public string Notes { get; set; }
public virtual ICollection<Lease> Leases { get; set; }
public virtual PropertyType PropertyType { get; set; }
public virtual ICollection<Service> Services { get; set; }
}
2 Respuestas
1
cree una clase ViewModel cuando necesite un subconjunto de la propiedad de una entidad, o una combinación de subconjuntos de propiedades de entidades
public class PropertyViewModel {
public int PropertyID {get;set;}
public string PropName {get;set;}
public int PropertyStatus {get;set;}
//etc.
public PropertyType PropertyType {get;set;}
}
luego seleccione el nuevo PropertyViewModel para cada propiedad (o use AutoMapper, que estaría bien para su necesidad https://github.com/AutoMapper/AutoMapper )
public ViewResult Index()
{
var properties = db.Properties.Include(prop => prop.PropertyType)
.Select(p => new PropertyViewModel {
PropertyID = p.PropertyID,
PropName = p.PropName,
//etc.
})
.ToList();
return View(properties);//View's model should be of tye IList<PropertyViewModel> (or IEnumerable)
}
Respondido 01 Jul 12, 09:07
En el pasado, intenté crear un modelo de vista, pero tuve problemas para devolver el valor de cadena para PropertyStatus, que si vuelve a la clase original Properties tiene una propiedad llamada PropertyEnumStatus que se usa con 'public int PropertyStatus { get; colocar; } // usado en corolación con la propiedad PropertyStatus // para permitir que la lista desplegable exceptúe los valores Enum // PropertyStatusType public PropertyStatusType PropertyEnumStatus { get { return (PropertyStatusType)PropertyStatus; } set { PropertyStatus = (int)valor; } }' - Shawn
El problema es que la lista devuelta a la vista es el valor de la clave y no la representación de cadena de la propiedad Enum. - Shawn
Todos... Gracias por su ayuda, pero creo que es posible que deba cambiar mi diseño de nuevo a un concepto de ViewModel como explicó Raphaël con la forma correcta de cargar una DropDownList que se encuentra en estas URL asp.net/mvc/tutorials/javascript/ … y blogs.msdn.com/b/rickandy/archive/2012/01/09/… – RickAndMSFT. - Shawn
0
bueno, parece que estás devolviendo un IEnumerable<T>
de un tipo anónimo de la consulta linq, pero esperando el List<Property>
para aceptar estos objetos como el tipo Property
. tan naturalmente el Add
el método resistirá.
Respondido 01 Jul 12, 08:07
Gracias por su respuesta y eso hace que lo que probablemente realmente necesite sea un ViewModel que se describe a continuación, pero me está dando problemas que expliqué en mi publicación de seguimiento a Raphaël: Shawn
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas asp.net-mvc asp.net-mvc-3 generics linq-to-entities or haz tu propia pregunta.
en lugar de todas las columnas seleccionadas, ¿intentaste?
select p
en tu consulta? ya que el objeto por el que estás regresandonew
no está destinado a serProperty
objeto. - Furqan Hameedi@tereško Solo intento seleccionar un subconjunto de las propiedades que se encuentran en la clase Property. Es por eso que traté de usar el nuevo { p.someprop} para seleccionar solo los valores requeridos. Corríjame si me equivoco, pero si "Selecciono p", devolvería todas las propiedades de la Entidad de propiedad, ¿correcto? - Shawn