MVC5 - использование часов для заполнения модели

Во-первых, я сам изучаю 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>

person cramar    schedule 08.03.2015    source источник
comment
вы заметите, что я оставил пару других элементов данных в контроллере (employeeId и т. д.). Моя фактическая модель и представление содержат их, поэтому это не ошибка, я просто забыл очистить ее перед публикацией.   -  person cramar    schedule 08.03.2015


Ответы (1)


Ну, после сна на нем... Я разобрался.

Проблема всегда заключалась в том, как я соединил сценарий.

@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>
}

Я использовал селектор идентификаторов вместо (#clockpicker) селектор класса (.clockpicker)

Оказывается, иногда простое описание проблемы может создать необходимое прозрение.

person cramar    schedule 08.03.2015