Свойство Html.HiddenFor value не устанавливается

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

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

Я делаю что-то не так? Спасибо

4 ответа

Решение

Вы пытались использовать модель представления вместо 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.

Следующее будет работать в 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;
}

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

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

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

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

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

Простой способ

@{
   Model.CRN = ViewBag.CRN;
}

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

Простой ответ - использовать @Html.TextboxFor, но поместить его в div, скрытый со стилем. Пример: в представлении:

<div style="display:none"> @Html.TextboxFor(x=>x.CRN) </div>

Другие вопросы по тегам