2014-06-30 1 views
1

J'ai rencontré une situation étrange. J'ai la viewmodel suivante:Obtention d'un comportement différent lors du passage de la méthode Model à BeginForm

public class Document{ 
    public string DocNumber{get;set;} 
    public string LastName {get;set;} 
    //omitted for brevity 
} 

Il y a une vue appelée EditDocument fortement typé à ce modèle. Sur une autre vue que j'ai le lien d'action suivant:

@Html.ActionLink("Edit", "EditDocument", "InwardDocument", new { docNumber=Model.DocNumber},null) 

est ici la méthode d'action EditDocument dans mon contrôleur InwardDocument:

public ActionResult EditDocument(string docNumber){ 
DocumentRepository repository = new DocumentCitizenRepository(); 
Document doc = repository.Documents.SingleOrDefault(x => x.DocNumber == docNumber); 
return View(viewName:"EditDocument",model: doc); 
} 

Et enfin, voici le EditDocument.cshtml:

@using (Html.BeginForm("SaveDocument","InwardDocument")){ 
    //omitted for brevity 
    <input type="submit" value="Save"> 
} 

La méthode d'action SaveDocument reçoit l'objet Document en tant que modèle. Lorsque je débogue cette méthode, je découvre que la propriété DocNumber du modèle est null. Mais lors du débogage de la méthode EditDocument, la valeur de la propriété DocNumber du document extrait du référentiel n'est pas nulle ("1" dans le cas où). Pour contourner ce problème, j'essayé de passer le modèle à la méthode BeginForm comme ceci:

@using (Html.BeginForm("SaveDocument","InwardDocument",new RouteValueDictionary(Model))) 

Il en effet aidé à résoudre le problème, mais j'ai deux préoccupations:

  1. Pourquoi le travail en passant du modèle? Le modèle n'est-il pas identique à tout ce qui est transmis par la méthode d'action? Passer le modèle résout le problème ci-dessus mais apporte un autre fléau. Si je vais cette façon, je reçois la valeur fausse case à cocher qui est décrite dans this SO question

Répondre

1

vous devez passer DocNumber dans un champ caché sous la forme sinon il sera affiché nulle:

@using (Html.BeginForm("SaveDocument","InwardDocument")) 
{ 

@Html.HiddenFor(x=>x.DocNumber) 

<input type="submit" value="Save"> 

} 
+0

Pourquoi dois-je créer un champ caché pour cela? Mon modèle contient déjà une propriété? Et en plus de cela, encore une fois, pourquoi le modèle qui passe résout-il le problème? –

+0

car les propriétés du modèle sont affichées via des contrôles d'entrée à l'intérieur du formulaire, nous devons donc créer un contrôle d'entrée pour chaque élément, ceux que nous ne voulons pas éditer ou afficher, nous utilisons des champs cachés, sinon ces propriétés seront nulles –

+0

OK , @Ehsan, j'ai compris pourquoi je dois avoir un champ caché pour ça. Fondamentalement parce qu'il n'y a pas d'endroit où lier la propriété du modèle. Il doit y avoir un élément html pour conserver les valeurs de propriété du modèle. Mais je serais heureux de savoir pourquoi le passage de Model à la méthode BeginForm fonctionne? –

Questions connexes