2011-08-11 2 views
0

J'ai le scénario suivant.Comment lier une propriété de modèle avec DefaultModelBinder - ASP.NET MVC2

  1. J'ai la vue Modifier/Employé rempli avec un modèle d'une entité Entity Framework (employé)
  2. Je posterai de Modifier/Employé à la Save/employé action du contrôleur. L'action Save/employés attendent un autre type (EmployeeSave) qui a employé comme propriété

Ceci est le menu Edition/méthode employé

public ActionResult Edit(EmployeesEdit command) 
    { 
     var employee = command.Execute(); 
     if (employee != null) 
     { 
      return View(employee); 
     } 
     return View("Index"); 
    } 

Ceci est la Save/méthode employé

public ActionResult Save(EmployeesSave command) 
    { 
     var result = command.Execute(); 
     if (result) 
     { 
      return View(command.Employee); 
     } 
     return View("Error"); 
    } 

Ceci est la classe EmployeeSave

public class EmployeesSave 
{ 
    public bool Execute() 
    { 
     // ... save the employee 
     return true; 

    } 
    //I want this prop populated by my model binder 
    public Employee Employee { get; set; } 
} 

Le MVC DefaultModelBinder est capable de résoudre les classes Employee et EmployeeSave.

+0

ce qui crée l'objet de commande passer dans la méthode d'action dans votre exemple? –

+0

@BlessYahu Le classeur de modèle par défaut ASP.NET MVC – abx78

Répondre

1

Vous devrez peut-être utiliser BindAttribute ici. Si votre vue contient les propriétés du EmployeeSaveViewModel et Employee nommés comme ceci (j'ai fait des noms de propriété)

<input type="text" name="EmployeeSaveViewModel.Property1" /> 
<input type="text" name="EmployeeSaveViewModel.Employee.Name" /> 
<input type="text" name="EmployeeSaveViewModel.Employee.SomeProperty" /> 

Ensuite, votre action pourrait ressembler à ceci:

[HttpPost] 
public ActionResult Save([Bind(Prefix="EmployeeSaveViewModel")] 
         EmployeeSaveViewModel vm) 
{ 
    if(ModelState.IsValid) 
    { 
     // do something fancy 
    } 

    // go back to Edit to correct errors 
    return View("Edit", vm); 
} 
+0

Cela pourrait être une bonne approche si j'ai l'EmployeesSave comme modèle. Mais comme vous pouvez le voir dans l'action Edit je viens d'ajouter que le modèle est l'employé. Voici ce que j'ai à mon avis: '' – abx78

+0

Je crois que ce serait la meilleure approche. Cela n'a aucun sens d'écrire un classeur de modèle personnalisé pour chaque commande/action dans votre application, même si vous héritez de DefaultModelBinder. L'injection de la commande en tant que viewmodel est plus à l'épreuve des erreurs et économise du temps. – abx78

0

Vous pouvez le résoudre en transmettant les données modifiées à l'action Modifier qui gère HttpPost. A l'intérieur, créez l'objet EmployeeSave et affectez à sa propriété Employee la valeur de Employee retourné à yout Edit. Appelez l'action Enregistrer en passant l'objet EmployeeSave.

[HttpGet] 
public ActionResult Edit() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Edit(Employee employee) 
{ 
    EmployeeSave employeeSave = new EmployeeSave { Employee = employee }; 

    return View("Save", employeeSave); 
} 

Une autre méthode serait d'utiliser EmployeeSave au lieu de l'employé comme modèle.

+0

L'utilisation de EmployeeSave à la place Employee résoudrait le problème. Mais j'aimerais garder la commande séparée de la vue. Alors laissez la vue fonctionner uniquement avec le modèle. Peut-être faut-il un classeur personnalisé? – abx78

Questions connexes