2016-10-15 6 views
0

Не знаете, как лучше выразить вопрос. Я хочу использовать поле hiddenFor, чтобы сохранить record_time в базе данных, показывая дату в html.display или аналогично этому полю без редактирования.Правильно отображать данные в режиме просмотра и сохранять их с помощью HiddenFor и DisplayFor

Создать действие

public ActionResult Create() 
    {    
     Record newRecord = new Record(); 
     newRecord.user_id = 1; //let it be 1 for simplicity 
     newRecord.record_time = System.DateTime.Now; 
     return View(newRecord); 
    } 

Создать вид

<div class="form-group"> 
     @Html.LabelFor(model => model.user_id, "User name", htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.HiddenFor(model => model.user_id) 
     </div> 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(model => model.record_time, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.HiddenFor(model => model.record_time) 

      //this line I'm concerned about 
      @Html.DisplayFor(model => model.record_time, new { htmlAttributes = new { @class = "form-control" } })    
     </div> 
    </div> 

ВОПРОСЫ

1) О user_id. Правильно ли использовать hiddenFor для новой записи, а не для редактора?

2) О record_time. Правильно ли использовать как скрытые, так и displayFor? какой из них будет использоваться для отправки данных обратно в базу данных? Каков правильный способ просто отобразить предопределенную информацию о времени и отправке в базу данных?

+1

Только элементы управления формой после возврата значения ('DisplayFor()' не создает элемент управления формой). Но вы не должны иметь контроль формы вообще для 'record_time' - вы просто устанавливаете контроллер, прежде чем сохранять данные. Что касается 'user_id' - если вы не хотите его редактировать, то это должен быть скрытый ввод –

+0

@StephenMuecke, спасибо большое. Большой совет, чтобы сохранить его в действии HttpPost. Я исправил соответственно, и теперь он совершенен. – SWA

ответ

1

Форма только представляет пары имя/значение своих элементов управления формой (input, select, textarea) и DisplayFor() не генерирует элемент управления формой.

Если вы хотите отформатировать дату, используя DisplayFor(), то вы можете использовать DisplayFormatAttribute, например

[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
public DateTime record_time { get; set; } 

или вы можете просто использовать <div>@Model.record_time.ToString("MM/dd/yyyy")</div>

Обратите внимание, что DisplayFor() визуализирует только текст, не является элементом , и он не имеет перегрузки, которая принимает htmlAttributes (нет элемента для применения атрибутов, поэтому его просто

@Html.DisplayFor(m => m.record_time) 

В качестве примечания стороны, имена обоих свойств указывают, что они предназначены для пользователя, который создал/отредактировал запись и дату создания записи. Если это так, вы не должны включать какие-либо входы для этих значений. Оба должны быть установлены в методе POST непосредственно перед сохранением модели данных. И если его создать представление, отображающее record_time (при условии, что это дата создания записи), не имеет смысла (он еще не создан).

+0

Я согласен с этим. Я сделал исправления, удалил дату из представления и назначил ее только в действии HttpPost. Также спасибо за параметры форматирования даты, второй - тот, который я могу использовать сейчас, пока не перейду от сгенерированных классов к видам моделей, поскольку обновление классов базы данных приведет к стиранию модификаций. – SWA