Абстракция интерпретации значений флажков MVC, полученных объектом FormsCollection - PullRequest
2 голосов
/ 03 февраля 2009

В ASP.NET MVC флажок HtmlHelper генерируется здесь:

<%= Html.CheckBox("List_" + mailingList.Key, true) %> 

как этот HTML:

<input id="List_NEW_PRODUCTS" name="List_NEW_PRODUCTS" type="checkbox" value="true" />
<input name="List_NEW_PRODUCTS" type="hidden" value="false" />

В случае, если вам интересно, почему есть дополнительное скрытое поле? - тогда прочитайте это . Это определенно решение, которое заставляет вас сначала думать «хммммм», но потом вы понимаете, что оно довольно элегантное.

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

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

Так что мне приходится писать такой код:

if (forms["List_RETAIL_NOTIFICATION"] == "true,false") {

}

или это:

if (forms.GetValues("List_RETAIL_NOTIFICATION")[0] == "true") {

}

Обе, на которые я до сих пор смотрю и съеживаюсь - тем более, что нет гарантии, что это всегда будет возвращаемое значение. Мне интересно, есть ли способ получить доступ к слою абстракции, используемому связывателями моделей - или я застрял с моим контроллером, «зная» так много о взломах HTTP POST.

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

Кроме того, я надеялся, что этот пост может помочь другим в поиске: «правда, ложь». Хотя я знал, почему это происходит, я просто забыл, и мне потребовалось немного времени, чтобы понять «дух».


К вашему сведению: я попробовал еще несколько вещей, и вот что я нашел:

forms["List_RETAIL_NOTIFICATION"] оценивается как "истина, ложь" forms.GetValues("List_RETAIL_NOTIFICATION")[0] оценивается как "истина" (forms.GetValue("List_RETAIL_NOTIFICATION").RawValue as string[])[0] оценивается как "истина" forms.GetValues("List_RETAIL_NOTIFICATION").FirstOrDefault() оценивается как "истинно"

Ответы [ 2 ]

0 голосов
/ 03 февраля 2009

Подшивка модели по умолчанию обрабатывает этот штраф. Так что если у вас есть:

public ActionResult Save(bool List_RETAIL_NOTIFICATION)

или

public ActionResult Save(MyObjectWithABoolPropertyToBeBoundFromACheckBox myObject)

это должно работать нормально.

0 голосов
/ 03 февраля 2009

Если вы:

  1. Создание модели со списком или чем-то для значений «пользовательских» свойств
  2. Присущий от DefaultModelBinder
  3. Переопределите BindProperty и что значения пользовательских свойств находятся в каком-то подходящем месте, например в списке в типе модели.

Тогда я думаю, что это в значительной степени то, что вы хотите. Вы используете привязку по умолчанию для логических полей, но добавляете свои собственные пользовательские свойства, не полагаясь на отражение типа вашей модели. См. Примечания к выпуску для кандидата на выпуск для получения дополнительной информации о создании пользовательского связывателя модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...