2016-10-15 4 views
0

Vous ne savez pas exactement comment exprimer la question. Je veux utiliser le champ hiddenFor pour enregistrer l'heure d'enregistrement dans la base de données lors de l'affichage de la date dans un html.display ou similaire à ce champ sans modification.Affichez correctement les données dans Afficher et enregistrez-les à l'aide de HiddenFor et de DisplayFor.

Créer une action

public ActionResult Create() 
    {    
     Record newRecord = new Record(); 
     newRecord.user_id = 1; //let it be 1 for simplicity 
     newRecord.record_time = System.DateTime.Now; 
     return View(newRecord); 
    } 

Créer une vue

<div class="form-group"> 
     @Html.LabelFor(model => model.user_id, "User name", htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.HiddenFor(model => model.user_id) 
     </div> 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(model => model.record_time, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.HiddenFor(model => model.record_time) 

      //this line I'm concerned about 
      @Html.DisplayFor(model => model.record_time, new { htmlAttributes = new { @class = "form-control" } })    
     </div> 
    </div> 

QUESTIONS

1) À propos user_id. Est-il correct d'utiliser hiddenFor pour un nouvel enregistrement, pas editorFor?

2) À propos de l'enregistrement. Est-il correct d'utiliser à la fois hiddenFor et displayFor? lequel sera utilisé pour renvoyer des données à la base de données? Quelle est la manière correcte d'afficher simplement une information datetime prédéfinie et de l'envoyer ensuite à la base de données?

+1

Seuls les contrôles de formulaire affichent une valeur ('DisplayFor()' ne crée pas de contrôle de formulaire). Mais vous ne devriez pas avoir de contrôle de formulaire pour 'record_time' - vous venez de définir dans le contrôleur avant de sauvegarder les données. En ce qui concerne 'user_id' - si vous ne voulez pas le modifier, il devrait s'agir d'une entrée cachée –

+0

@StephenMuecke, merci beaucoup. Bon conseil pour l'enregistrer dans l'action HttpPost. J'ai corrigé en conséquence et c'est parfait maintenant. – SWA

Répondre

1

Un formulaire soumet uniquement les paires nom/valeur de ses contrôles de formulaire (input, select, textarea) et DisplayFor() ne génère pas de contrôle de formulaire.

Si vous voulez formater la date en utilisant DisplayFor(), vous pouvez utiliser le DisplayFormatAttribute, par exemple

[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
public DateTime record_time { get; set; } 

ou vous pouvez simplement utiliser <div>@Model.record_time.ToString("MM/dd/yyyy")</div>

Notez que DisplayFor() rend juste le texte, pas un élément , et il n'a pas une surcharge qui accepte htmlAttributes (il n'y a pas d'élément à appliquer des attributs, donc c'est juste

@Html.DisplayFor(m => m.record_time) 

En note, les noms de vos deux propriétés indiquent qu'ils sont pour l'utilisateur qui a créé/modifié l'enregistrement et la date à laquelle l'enregistrement a été créé. Si tel est le cas, vous ne devez pas inclure d'entrées pour ces valeurs. Les deux doivent être définis dans la méthode POST immédiatement avant d'enregistrer le modèle de données. Et si c'est une vue de création, l'affichage du record_time (en supposant que c'est la date à laquelle l'enregistrement a été créé) n'a aucun sens non plus (il n'a pas encore été créé).

+0

Je suis d'accord avec ça. J'ai fait les corrections, enlevé la date de la vue et l'assigner seulement dans l'action HttpPost. Merci aussi pour les options de formatage de date, la seconde est celle que je peux utiliser maintenant jusqu'à ce que je passe des classes générées aux viewmodels puisque la mise à jour des classes de base de données effacera les modifications. – SWA