Получение значений полей ввода в MVC

#c# #asp.net-mvc #entity-framework #checkbox

#c# #asp.net-mvc #entity-framework #флажок

Вопрос:

Я немного новичок в MVC, и, возможно, я просто что-то недопонимаю, но я не могу понять, как сделать следующее элегантным способом: у меня есть следующий объект, который я не хочу обновлять: Модель:

 public class Entity
    {
        [Key]
        public int Id { get; set; }
        public DateTime Created { get; set; }
        public int FieldInt { get; set; }
        public DateTime FieldDate { get; set; }
        public int FieldOther {get; set; }
    }
}
  

Вид:
В моем представлении отображается множество текстовых строк с прикрепленными флажками. Флажки идентифицируются двумя атрибутами данных: data-field-int и data-field-date, что примерно соответствует следующему.

 @html.BeginForm("Confirm", "Home", FormMethod.Post) {
...
<input type='checkbox' data-field-int="1" data-field-date="2014/01/01" />
<input type='checkbox' data-field-int="1" data-field-date="2014/02/02" />
<input type='checkbox' data-field-int="1" data-field-date="2014/03/03" />
...
<button id="ConfirmButton" type="submit" class="btn btn-primary">Confirm</button>
}
  

Что я хочу в контроллере, так это при нажатии кнопки подтверждения создать объект Entity для каждого флажка, который проверяется значением fieldInt и fieldDate, заполненными атрибутами data-field-int и data-field-date соответственно.

Я могу сделать это, заставив действие контроллера принимать FormCollection в качестве входных данных и поместив атрибут name в флажки с объединением fieldInt и fieldDate, а затем разделить их в контроллере и обновить базу данных. Но, похоже, был бы лучший способ, поскольку MVC настолько умен с Entity Framework.

Я надеюсь, что вы, ребята, можете помочь мне понять

Спасибо, Питер

Ответ №1:

добро пожаловать в MVC.

-Наилучшей практикой является использование razor engine с объектами модели.

-В вышеупомянутом коде вам нужно установить что-то вроде этого

 @using ( Html.BeginForm("Confirm", "Home", FormMethod.Post))
  

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

-Наконец, просто используйте model x в качестве параметра для вашего [HttpPost] метода действия и преобразуйте эти объекты в ваши объекты Entity framework и сохраните в DB

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

Как @Html.HiddenFor(m => m.FieldInt) или <input type="hidden" name="FieldInt" value="1234" /> // сделайте аналогично для остальных

Передача статических данных затем @{Model.phoneno = "1234"}

Комментарии:

1. Спасибо за ответ, но я не понимаю, как я могу связать @html.CheckBoxFor(.. с созданием объекта в модели, где field1 = x и field2 = y

2. Спасибо, я думаю, что начинаю понимать ☺

Ответ №2:

Этот вопрос состоит из двух частей:

1. Полезно указать @model в razor view и использовать вспомогательные методы, которые принимают лямбда-выражения с моделью в качестве параметра.

 @model MyType

html.Textbox(model => model.FieldOther,...)
  

Затем вы создаете действие, которое использует модель

 [HttpPost]
ActionResult MyAction(MyModel model) {
 ....
}
  

Mvc попытается создать экземпляр модели и сопоставить поля формы со свойствами модели.

2.

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