Свойство Html.HiddenFor значение не установлено

Я мог бы использовать

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

но, я понимаю,

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

Чтобы как-то обойти эту проблему (id=ViewData_crn_ and name=ViewData[crn]), я попытался сделать следующее, но атрибут "значение" не будет установлен.

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

генерирует

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

Я что-то делаю неправильно? благодаря

Ответ 1

Вы пытались использовать модель представления вместо ViewData? Сильно введенные помощники, которые заканчиваются For и принимают выражение лямбда, не могут работать со слабо типизированными структурами, такими как ViewData.

Лично я не использую ViewData/ViewBag. Я определяю модели представления, и мои действия с контроллером передают эти модели просмотра в мои представления.

Например, в вашем случае я бы определил модель представления:

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

у меня есть действие с моим контроллером:

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

и затем, чтобы мой строго типизированный вид просто использовал помощник EditorFor:

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

который бы породил меня:

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

в полученном HTML.

Ответ 2

В MVC 4 будет работать следующее:

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

Свойство @Value чувствительно к регистру. Вам нужна капитальная 'V' на @Value.

Вот моя модель

public int CRN { get; set; }

Вот что выводится в html, когда вы смотрите в браузере

<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"/>

Вот мой метод

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

Ответ 3

Я считаю, что есть более простое решение. Вы должны использовать Html.Hidden вместо Html.HiddenFor. Посмотрите:

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

Это создаст тег INPUT type="hidden", с id="CRN" и name="CRN" и правильное значение внутри атрибута value.

Надеюсь, поможет!

Ответ 4

Имейте в виду, что второй параметр для @Html.HiddenFor будет использоваться только для установки значения, если он не может найти маршрут или данные модели, соответствующие полю. Дарин правильно, используйте модель взгляда.