Во-первых, я сам изучаю MVC, поэтому ничто из этого не может быть лучшей практикой, и вопрос можно рассматривать как MVC 101. Я гуглил и пробовал разные вещи в течение нескольких дней, поэтому в отчаянии я ищу помощи.
Я использую MVC5, EF6 и Bootstrap 3.
Моя цель проста: я хочу отобразить представление, которое позволяет пользователю вводить время, используя средство выбора времени в стиле часов для Bootstrap настоящий Clockpicker можно найти здесь, на GitHub. Результат этого затем заполняется обратно в мою базу данных, когда пользователь нажимает кнопку «Создать» в представлении.
Однако я не могу заставить его работать. Ниже я включил упрощенную версию модели, контроллера и представления. В представлении я могу заставить отображать часы с помощью HTML, который я нашел в примерах, но я не уверен, как привязать его к моей модели. Если я использую вспомогательные методы html, используя то, как я это делал для других элементов начальной загрузки, он не будет отображать средство выбора часов. Если я закодирую его в соответствии с примером, он отобразит часы, но тогда я не знаю, как связать результат с моей моделью и, следовательно, с базой данных.
Если у вас есть пример кода или вы можете указать мне где-нибудь, что может объяснить, как я должен это сделать, я был бы признателен.
Я надеюсь, что вопрос имеет смысл.
МОДЕЛЬ
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ATAS.Models
{
public partial class Authorisation : IControllerHooks
{
public long AuthorisationId { get; set; }
[Required, StringLength(10)]
public string AuthorisationNumber { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime StartTime { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime FinishTime { get; set; }
}
}
КОНТРОЛЛЕР (я только что включил действие «Создать»)
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using ATAS.Data;
using ATAS.Models;
namespace ATAS.Controllers
{
public class AuthorisationsController : Controller
{
private DataManager db = new DataManager();
// GET: /Authorisations/Create
public ActionResult Create()
{
ViewBag.AuthorisedEmployeeId = new SelectList(db.Employees, "EmployeeId", "FullName");
ViewBag.PaymentTypeId = new SelectList(db.OvertimeTypes, "PaymentTypeId", "Description");
ViewBag.AuthorisingEmployeeId = new SelectList(db.Employees, "EmployeeId", "FullName");
return View();
}
// POST: /Authorisations/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="AuthorisationId,DateAuthorised,StartTime,FinishTime")] Authorisation authorisation)
{
if (ModelState.IsValid)
{
if (authorisation is IControllerHooks) { ((IControllerHooks)authorisation).OnCreate(); }
db.Authorisations.Add(authorisation);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.AuthorisedEmployeeId = new SelectList(db.Employees, "EmployeeId", "FullName", authorisation.AuthorisedEmployeeId);
ViewBag.PaymentTypeId = new SelectList(db.OvertimeTypes, "PaymentTypeId", "Description", authorisation.PaymentTypeId);
ViewBag.AuthorisingEmployeeId = new SelectList(db.Employees, "EmployeeId", "FullName", authorisation.AuthorisingEmployeeId);
return View(authorisation);
}
ПРОСМОТР (CREATE.cshtml)
@model ATAS.Models.Authorisation
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Authorisation</h4>
<hr />
@Html.ValidationSummary(true)
<div class="col-sm-12">
<div class="form-group">
<label>Clockpicker:</label>
<div class="input-group">
<input class="form-control" id="clockpicker" type="text" placeholder="Select time" data-autoclose="true">
<span class="input-group-addon"><i class="fa fa-clock-o"></i></span>
</div>
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.FinishTime, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.FinishTime, new { @class = "clockpicker" })<br />
@Html.ValidationMessageFor(model => model.FinishTime)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section pagespecific {
<script src="/scripts/plugin/clockpicker/clockpicker.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
// PAGE RELATED SCRIPTS
/*
* CLOCKPICKER
*/
$('#clockpicker').clockpicker({
placement: 'top',
donetext: 'Done'
});
})
</script>
}
ПРОБЛЕМА
*****Этот подход отображает часы, но я не знаю, как привязать его к модели****
<div class="col-sm-12">
<div class="form-group">
<label>Clockpicker:</label>
<div class="input-group">
<input class="form-control" id="clockpicker" type="text" placeholder="Select time" data-autoclose="true">
<span class="input-group-addon"><i class="fa fa-clock-o"></i></span>
</div>
</div>
</div>
*****Этот подход не будет отображать циферблат*****
<div class="form-group">
@Html.LabelFor(model => model.FinishTime, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.FinishTime, new { @class = "clockpicker" })<br />
@Html.ValidationMessageFor(model => model.FinishTime)
</div>
</div>