#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.
Вы можете использовать объект в качестве модели, но, поверьте мне, так называемые объекты передачи данных и / или модели представлений были созданы не просто так, и по мере развития приложения отдельные представления также развиваются, чтобы манипулировать данными из многих связанных объектов базы данных.