2011-06-01 14 views
14

Tengo dos modelos: categoría y artículo. Tengo prácticamente las mismas vistas y controladores de eliminación para ambos. La única diferencia es que funciona para categorías, pero con artículos obtengo un modelo vacío en HttpPost.MVC3 - Modelo vacío en la publicación

Categorías:

public ActionResult DeleteCat(int id) 
    { 
     Category cat = db.CategoryByID(id); 
     if (cat != null) 
     { 
      return View(cat); 
     } 

     return RedirectToAction("Index"); 
    } 

    [HttpPost] 
    public ActionResult DeleteCat(Category model) 
    { 
     db.DeleteCategory(model.CategoryID); 

     return RedirectToAction("Index"); 
    } 

Artículos:

public ActionResult Delete(int id) 
    { 
     Article art = db.ArticleByID(id); 
     if (art != null) 
     { 
      return View(art); 
     } 

     return RedirectToAction("Index"); 

    } 

    [HttpPost] 
    public ActionResult Delete(Article model) 
    { 
     db.DeleteArticle(model.ArticleID); 

     return RedirectToAction("Index"); 
    } 

Ambos puntos de vista son generados por Visual Studio y no los han cambiado. Cuando quiero eliminar una categoría, todo va bien. Pero cuando quiero eliminar un artículo, primero se selecciona correctamente de la base de datos, luego se muestra la vista (todo está bien) pero cuando hago clic en el botón Eliminar el modelo está vacío (todas las propiedades son 0, nulas o falsas) y entonces el db.DeleteArticle arroja una excepción (no hay artículo con ArticleID = 0). ¿Podría alguien darme alguna pista sobre qué debo verificar o cómo debo solucionar esto?

+0

Lo que se ve su clase Article ¿me gusta? – Keith

+2

¿Qué se PUBLICA? – SLaks

+0

Sí, y al igual que @SLaks dice, puede agregar un parámetro a su acción HttpPost Delete a la 'FormCollection coll'. Una vez publicado, puede inspeccionar la colección para ver todas las claves/valores que se publicaron con el formulario. – Keith

Respuesta

6

Hay dos formas principales en que esto puede suceder.

Una forma es que tiene un encuadernado de modelo personalizado que no funciona. Supongo que está haciendo todo lo que está fuera de la caja para que esto no se aplique.

Lo más probable es que los datos no se publiquen. Asegúrese de que existan los campos dentro de el mismo Formulario que el botón Eliminar está PUBLICANDO.

10

Tenía el mismo problema. Una de mis propiedades en el modelo fue llamado modelo

public String model { get; set; } 

Después de cambiar el nombre de la propiedad para myModel. El objeto modelo dejó de volverse nulo en ActionResult

+0

¡Esto es realmente aleatorio! No puedo creer que exista un error como este, ¡y aún no se ha resuelto! – Andy

+2

Mi parámetro se llamaba nombre y causaba el mismo problema. ¡Gracias! – Derrick

+0

De nada :) – adinas

9

Asegúrese de que su modelo esté marcando sus propiedades como propiedades (si usa VB o C# con get/set), no como un campo público ... MVC no se correlacionará con campo público, pero lo hará a la propiedad pública.

17

Si el parámetro para el modelo en la Acción [HttpPost] es el mismo nombre que una propiedad en el modelo, será nulo y no validará la validación diciendo que el campo no es válido.

Ejemplo:

public class ContactMessage { 
    public string Name { get; set; } 
    public string sankdmfskm { get; set; } 
} 

[HttpPost] 
public ActionResult Index(ContactMessage sankdmfskm) 
{ 
... 
} 

sankdmfskm habrá null.

Probado en MVC3 y MVC4.

2

Tuve el mismo problema que tú. Lo hice en su caso

[HttpPost] 
public ActionResult Index(ContactMessage sankdmfskm) 
{ 
UpdateModel(sankdmfskm); 
... 
} 

Después de que el modelo se actualizó, me devolvió los valores correctos y no más nulos.

0

Estoy agregando una respuesta a esto porque difiere de los demás y alguien puede encontrarlo útil.

Tenía un modelo BaseView porque usaba varios modelos en una vista.

En mi Acción controlador en lugar de pasar el BaseViewModel (y los parámetros como model.RegistrationFormModel.Username) Me pasó RegistrationFormModel por lo que no es vinculante para el BaseViewModel que estaba usando en mi opinión

+0

quizás un pequeño fragmento de código ayudaría – theLearner

Cuestiones relacionadas