Как имитировать флажок MVC -> связывание модели bool? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть шаблон редактора, который снимает флажок:

@Html.CheckBoxFor(model => model.Follow)

, который отображает что-то вроде этого:

<input checked="checked" data-val="true" data-val-required="The Follow field is required." id="Follow" name="Follow" type="checkbox" value="true" />
<input name="Follow" type="hidden" value="false" />

AFAIK скрытое поле - это что-то, что связано с общественным питаниемкогда не отмеченный флажок не отправляется на сервер или что-то еще.

В любом случае, если я посмотрю на Request.Form["Follow"], когда флажок флажок , я вижу значение "true, false ".

Как заставить bool из этого значения?Я просто игнорирую второе поле?(например, скрытое поле).

Я делаю это базовый контроллер (защищенный метод, вызывается из дочернего контроллера), поэтому у меня нет строго типизированной модели представления, только необработанный Request объект.

Кто-нибудь может помочь?Или, в качестве альтернативы, если кто-то может указать мне, где в исходном коде MVC это происходит, я мог бы взглянуть сам, но не уверен, с чего начать.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Вы правы, скрытое поле только для того, чтобы форма была отправлена ​​на сервер. Потому что если в форме есть только флажки, которые не отмечены, то ничего не будет отправлено, и сервер не будет знать, чтобы установить для них значение false.

  1. Вам нужно только 1 скрытое поле на форму, вам не нужно одно на флажок. Но если вы делаете свой собственный контроль, трудно сказать, находится ли скрытое текстовое поле на поле или нет. Если вы знаете, что у вас всегда будет текстовое поле или список выбора и т. Д. Где-то еще в ваших формах, вам вообще не нужно скрытое текстовое поле

  2. Вы можете переименовать ваше скрытое текстовое поле в любое имя, названное «фиктивным», или как-то иначе, чем имя флажка, поэтому Request.Form ["Follow"]; будет возвращать только значение флажка не нужно разделять. Вам никогда не нужно проверять значение «скрытого текстового поля».

На заметку о том, что вы не должны использовать Request.Form ["Follow"], у вашего метода Action должен быть такой параметр вместо "bool? Follow"

2 голосов
/ 08 ноября 2011

Помощник MVC отображает элемент управления ввода флажка с двумя полями ввода, флажком и скрытым, поскольку браузер не отправляет значение для поля ввода флажка, если флажок не установлен.Если вы не используете автоматическое сопоставление, вам необходимо проанализировать входное значение, полученное из формы.

Используйте это простое правило для определения флажка:

var rawFollow = Request.Form["Follow"];
if (rawFollow.Contains("true"))
{
  // do something
}   
1 голос
/ 08 ноября 2011

Насколько я знаю, дополнительное скрытое поле заключается в том, что если флажок НЕ установлен, то входные данные не будут отправлены с формой, и поэтому нам нужно скрытое поле со значением false.

Таким образом, единственное решение, о котором можно подумать, это:

var rawFollow = Request.Form["Follow"];
var rawFollows = rawFollow.Split(',');
if (rawFollows.Count() > 1)
{
   rawFollow = rawFollows[0];
}

Но это кажется странным (а как насчет порядка элементов на странице, что если по какой-то причинескрытое поле было ПЕРВЫМ, тогда оно всегда оценивалось бы как ложное), поэтому мне интересно, как это делает источник MVC.

...