web-dev-qa-db-fra.com

La propriété de valeur Html.HiddenFor n'est pas définie

J'aurais pu utiliser

@Html.HiddenFor(x=> ViewData["crn"])

mais je reçois,

<input id="ViewData_crn_" name="ViewData[crn]" type="hidden" value="500" />

Pour contourner ce problème (id=ViewData_crn_ and name=ViewData[crn]), J'ai essayé de faire ce qui suit, mais l'attribut "value" n'est pas défini.

@Html.HiddenFor(x => x.CRN, new { @value="1"})
@Html.HiddenFor(x => x.CRN, new { @Value="1"})

génère

<input id="CRN" name="CRN" type="hidden" value="" />
<input Value="500" id="CRN" name="CRN" type="hidden" value="" />

Suis-je en train de faire quelque chose de mal ?? Merci

27
Sekhar

Avez-vous essayé d'utiliser un modèle de vue au lieu de ViewData? Les assistants fortement typés qui se terminent par For et prennent une expression lambda ne peuvent pas fonctionner avec des structures faiblement typées telles que ViewData.

Personnellement, je n'utilise pas ViewData/ViewBag. Je définis des modèles de vue et demande à mes actions de contrôleur de transmettre ces modèles de vue à mes vues.

Par exemple, dans votre cas, je définirais un modèle de vue:

public class MyViewModel
{
    [HiddenInput(DisplayValue = false)]
    public string CRN { get; set; }
}

que mon action de contrôleur remplisse ce modèle de vue:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        CRN = "foo bar"
    };
    return View(model);
}

et que ma vue fortement typée utilise simplement un assistant EditorFor:

@model MyViewModel
@Html.EditorFor(x => x.CRN)

ce qui me générerait:

<input id="CRN" name="CRN" type="hidden" value="foo bar" />

dans le code HTML résultant.

38
Darin Dimitrov

Les éléments suivants fonctionneront dans MVC 4

@Html.HiddenFor(x => x.CRN, new { @Value = "1" });

La propriété @Value est sensible à la casse. Vous avez besoin d'un "V" majuscule sur @Value.

Voici mon modèle

public int CRN { get; set; }

Voici ce qui est sorti en html lorsque vous regardez dans le navigateur

<input value="1" data-val="true" data-val-number="The field CRN must be a number." data-val-required="The CRN field is required." id="CRN" name="CRN" type="hidden" value="1"/>

Voici ma méthode

[HttpPost]
public ActionResult MyMethod(MyViewModel viewModel)
{
  int crn = viewModel.CRN;
}
53
Gudradain

Je pense qu'il existe une solution plus simple. Tu dois utiliser Html.Hidden au lieu de Html.HiddenFor. Regardez:

@Html.Hidden("CRN", ViewData["crn"]);

Cela créera une balise INPUT de type="hidden", avec id="CRN" et name="CRN" et la valeur correcte dans l'attribut value.

J'espère que ça aide!

5
Marcio Paulo

Gardez à l'esprit que le deuxième paramètre de @ Html.HiddenFor ne sera utilisé que pour définir la valeur lorsqu'il ne peut pas trouver de données d'itinéraire ou de modèle correspondant au champ. Darin est correct, utilisez le modèle de vue.

3
RickAndMSFT