web-dev-qa-db-fra.com

Entrée MVC Razor Hidden et valeurs de passage

Je suis sûr que je fais quelque chose de mal ici. Au cours des 2 derniers mois, nous avons développé une application Web utilisant MVC et Razor et nous n'avons jamais pensé à utiliser l'élément de formulaire. Maintenant, tant de choses ont déjà été faites avec les pages maîtres et les sous-pages que cela signifie la restructuration de la plupart de notre code afin d'utiliser l'élément de formulaire et cela entraînerait plusieurs éléments de formulaire sur une page.

Cela mis à part, dans Asp.Net si je voulais accéder à n'importe quel contrôle dans le code C # derrière, je pouvais simplement lui donner un ID = "SomeID" et un RUNAT = "SERVER". Ensuite, dans mon code, je pouvais définir sa valeur et ses propriétés.

Quand je fais cela dans Razor, nous utilisons des lignes comme:

 <input id="hiddenPostBack" runat="server" type="hidden" />

Pourquoi ne puis-je pas accéder à cela dans le contrôleur? Je veux détecter une publication et définir la valeur sur false si c'est la première fois que la page se charge, et sinon, définir la valeur sur true. Ensuite, sur cette base, je vais le lire côté serveur ou côté client et faire quelque chose.

Ma vraie question est de savoir comment "faire quelque chose" à la fois côté serveur et côté client étant donné que je n'ai pas d'élément de formulaire. J'avais l'impression que si je voulais transmettre des valeurs du client au serveur et vice-versa, la façon la plus simple de le faire est d'utiliser une entrée cachée. Mais je ne comprends tout simplement pas comment accomplir cela avec MVC3 et le rasoir.

Merci d'avance pour votre aide.

18
Francis Rodgers

Un passage de WebForms à MVC nécessite un changement complet de la logique et des processus cérébraux. Vous n'interagissez plus avec le "formulaire" à la fois côté serveur et côté client (et en fait, même avec WebForms, vous n'interagissiez pas côté client). Vous avez probablement juste mélangé un peu de réflexion là-dedans, avec WebForms et RUNAT="SERVER" Vous interagissiez simplement avec le bâtiment de la page Web.

MVC est quelque peu similaire en ce sens que vous avez du code côté serveur dans la construction du modèle (les données dont vous avez besoin pour construire ce que votre utilisateur verra), mais une fois que vous avez construit le HTML, vous devez comprendre que le lien entre le serveur et l'utilisateur n'existe plus. Ils ont une page HTML, c'est tout.

Le HTML que vous construisez est donc lecture seule. Vous passez le modèle à la page Razor, qui créera du HTML approprié à ce modèle.

Si vous souhaitez avoir un élément caché qui définit true ou false selon qu'il s'agit de la première vue ou non, vous avez besoin d'un booléen dans votre modèle, et définissez-le sur True dans l'action si c'est en réponse à un suivi. Cela peut être fait en ayant différentes actions selon que la demande est [HttpGet] ou [HttpPost] (si cela convient à la façon dont vous configurez votre formulaire: une demande GET pour la première visite et une demande POST si vous soumettez une forme).

Alternativement, le modèle peut être défini sur True lors de sa création (ce sera la première fois que vous visitez la page), mais après vous vérifiez que la valeur est True ou False (car un bool par défaut est False lorsque c'est instancié). Puis en utilisant:

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

dans votre formulaire, qui mettra un vrai caché. Lorsque le formulaire est renvoyé sur votre serveur, le modèle aura désormais cette valeur définie sur True.

Il est difficile de donner beaucoup plus de conseils que cela, car votre question n'est pas spécifique quant à pourquoi vous voulez le faire. Il est peut-être essentiel que vous lisiez un bon livre sur le passage à MVC à partir de WebForms, tel que Pro ASP.NET MVC de Steve Sanderson.

36
Steve Owen

Si vous utilisez Razor, vous ne pouvez pas accéder directement au champ, mais vous pouvez gérer sa valeur.

L'idée est que la première approche Microsoft éloigne les développeurs du développement Web et facilite la création d'applications Web par les programmeurs (par exemple).

Pendant ce temps, les développeurs Web n'ont pas compris cette étrange façon délicate d'ASP.NET.

En fait, cette entrée cachée est rendue côté client, et le ASP n'y a pas accès (il ne l'a jamais eu). Cependant, avec le temps, vous verrez que c'est une manière piratée et vous pouvez compter sur quand vous vous en servez. Le développement Web diffère du bureau ou du mobile.

Le modèle est votre unité logique, et le champ caché (et la page de vue entière) n'est qu'une vue représentative des données. Vous pouvez donc dédier votre travail sur la logique de l'application ou du domaine et la vue la sert simplement au consommateur - ce qui signifie que vous n'avez besoin d'aucun accès détaillé et de fonctionnalités de "brainstorming" dans la vue.

Le contrôleur fonctionne réellement pour gérer la configuration cachée ou générale. Le modèle sert des propriétés et des fonctionnalités d'unités logiques spécifiques et la vue les rend simplement à l'utilisateur final, simplement dit. En savoir plus sur MVC .

Modèle

public class MyClassModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string MyPropertyForHidden { get; set; }
}

C'est le contrôleur aciton

public ActionResult MyPageView()
{
    MyClassModel model = new MyClassModel(); // Single entity, strongly-typed
    // IList model = new List<MyClassModel>(); // or List, strongly-typed
    // ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag

    return View(model);
}

La vue est en dessous

//This will make a Model property of the View to be of MyClassModel
@model MyNamespace.Models.MyClassModel // strongly-typed view
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view

// ... Some Other Code ...

@using(Html.BeginForm()) // Creates <form>
{
    // Renders hidden field for your model property (strongly-typed)
    // The field rendered to server your model property (Address, Phone, etc.)
    Html.HiddenFor(model => Model.MyPropertyForHidden); 

    // For list you may use foreach on Model
    // foreach(var item in Model) or foreach(MyClassModel item in Model)
}

// ... Some Other Code ...

La vue avec ViewBag:

// ... Some Other Code ...

@using(Html.BeginForm()) // Creates <form>
{
    Html.Hidden(
        "HiddenName",
        ViewBag.MyHiddenInputValue,
        new { @class = "hiddencss", maxlength = 255 /*, etc... */ }
    );
}

// ... Some Other Code ...

Nous utilisons Html Helper pour rendre le champ caché ou nous pourrions l'écrire à la main - <input name=".." id=".." value="ViewBag.MyHiddenInputValue"> également.

Le ViewBag est une sorte de support de données pour la vue. Cela ne vous limite pas avec le modèle - vous pouvez placer ce que vous voulez.

8
Rolice

Comme vous l'avez peut-être déjà compris, Asp.Net MVC est un paradigme différent d'Asp.Net (formulaires Web). L'accès aux éléments de formulaire entre le serveur et le client adopte une approche différente dans Asp.Net MVC.

Vous pouvez google plus de lecture sur ce sujet sur le Web. Pour l'instant, je suggère d'utiliser Ajax pour obtenir ou publier des données sur le serveur. Vous pouvez toujours utiliser input type="hidden", mais initialisez-le avec une valeur de ViewData ou pour Razor, ViewBag.

Par exemple, votre contrôleur peut ressembler à ceci:

public ActionResult Index()
{
     ViewBag.MyInitialValue = true;
     return View();
} 

Selon vous, vous pouvez avoir un elemet d'entrée qui est initialisé par la valeur dans votre ViewBag:

<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" />

Ensuite, vous pouvez transmettre des données entre le client et le serveur via ajax. Par exemple, en utilisant jQuery:

$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) {
   // blah
});

Vous pouvez également utiliser $.ajax , $.getJSON , $.post selon vos besoins.

1
Alex R.

Tout d'abord, ASP.NET MVC ne fonctionne pas de la même manière que WebForms. Vous n'avez pas tout runat="server" chose. MVC n'offre pas la couche d'abstraction offerte par WebForms. Probablement, vous devriez essayer de comprendre ce que sont les contrôleurs et les actions, puis vous devriez regarder la liaison du modèle. Tout didacticiel de niveau débutant sur MVC montre comment vous pouvez transmettre des données entre le client et le serveur.

0
user840210