C# 如何在此日历视图中每天添加复选框?

C# 如何在此日历视图中每天添加复选框?,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,calendar,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Calendar,我试图在日历视图中的每一天添加一个简单的复选框功能。它必须与当前日历的样式内联,并且当选择bool时,它必须能够将更改保存到数据库。如有任何建议,将不胜感激 我目前的主要问题是选中的复选框没有保存到数据库中 控制器.cs private F2FW _db = new F2FW(); [HttpGet] public ActionResult CalendarIndex() { List<Event> events = new List<Even

我试图在日历视图中的每一天添加一个简单的复选框功能。它必须与当前日历的样式内联,并且当选择bool时,它必须能够将更改保存到数据库。如有任何建议,将不胜感激

我目前的主要问题是选中的复选框没有保存到数据库中

控制器.cs

private F2FW _db = new F2FW();

[HttpGet]
    public ActionResult CalendarIndex()
    {
        List<Event> events = new List<Event>();
        Project.Models.Calendar calendar = new Project.Models.Calendar();
        calendar.SetDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
        calendar.View(@"~\Views\Patient\Calendar.cshtml");
        calendar.ViewData.Add("events", events);

        ViewBag.calendar = calendar.Render();

        return View(calendar);
    }
        [HttpPost]
        public ActionResult CalendarIndex(User user, CalendarArg calArg, int dayCounter, string[] cbx_day, Patient patient, SessionExercise sessionExercise)
        {
            SessionInformation sessiondata = new SessionInformation();
            Session lastsession = db.Sessions.Where(s => s.ActiveUserID == user.UserID).OrderByDescending(e => e.StartedAt).FirstOrDefault();
            calArg.CompletedToday = DateTime.Today;
            if (ModelState.IsValid)
            {
                if (calArg.CompletionRequested == false)
                {
                    //do nothing!
                }
                else if (calArg.CompletionRequested == true)
                {
                    if (sessiondata.Completed == true)
                    {
                        if (sessionExercise.FinishedAt == calArg.Past)
                        {
                            List<Event> events = new List<Event>();
                            events.Add(new Event() { Title = "Exercises Completed", EventDate = DateTime.Now.AddDays(0), Type = Event.EventType.Vacation }); //green
                        }

                    }
                    if (sessiondata.Completed == false)
                    {
                        if (sessionExercise.FinishedAt == calArg.Past)
                        {
                            List<Event> events = new List<Event>();
                            events.Add(new Event() { Title = "Exercises Uncompleted", EventDate = DateTime.Now.AddDays(0), Type = Event.EventType.Critical }); //red
                        }
                    }
                }
                _db.SaveChanges();
                return RedirectToAction("CalendarIndex"); // or where ever you want to go
            }
            else
            {
                return View(calArg);
            }
        }
public class Event
{
    public string Title
    {
        get;
        set;
    }

    public DateTime EventDate
    {
        get;
        set;
    }

    public EventType Type
    {
        get;
        set;
    }

    public enum EventType
    {
        Appointment,
        Meeting,
        Vacation,
        Birthday,
        Personal,
        Critical
    }
}
public class Calendar
{
    int _year;
    int _month;
    DateTime _selectedDate;
    string _viewFile = "";
    ViewDataDictionary _viewData = new ViewDataDictionary();

    Func<DateTime, bool, string> _onDayRenderFunc = null;

    public Calendar()
    {
        SetDate(DateTime.Now.Year, DateTime.Now.Month);
    }

    public void SetDate(int year, int month)
    {
        _year = year;
        _month = month;
        _selectedDate = new DateTime(_year, _month, 1);
    }

    public void SetDate(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _selectedDate = new DateTime(_year, _month, day);
    }

    public DateTime Date
    {
        get
        {
            return _selectedDate;
        }
    }

    public void OnDayRender(Func<DateTime, bool, string> func)
    {
        _onDayRenderFunc = func;
    }

    public void View(string viewFile)
    {
        _viewFile = viewFile;
    }

    public ViewDataDictionary ViewData
    {
        get
        {
            return _viewData;
        }
    }

    public string Render()
    {
        string[] dayNames = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

        int daysInMonth = DateTime.DaysInMonth(_year, _month);
        int pYear = _year;
        int pMonth = _month;

        if ((_month - 1) < 1)
        {
            --pYear;
            pMonth = 12;
        }
        else
        {
            --pMonth;
        }

        int daysInPrevMonth = DateTime.DaysInMonth(pYear, pMonth);

        DateTime d1 = new DateTime(_year, _month, 1);
        int dayPos = (int)d1.DayOfWeek;
        daysInPrevMonth -= dayPos - 1;

        StringBuilder control = new StringBuilder();
        control.Append("<table cellpadding=\"0\" cellspacing=\"0\">\n<thead>\n<tr>\n");

        for (int i = 0; i < dayNames.Length; i++)
        {
            control.Append(string.Format("<th>{0}</th>\n", dayNames[i]));
        }

        control.Append("</thead>\n<tbody>\n");

        int totalDaysInMonth = daysInMonth + dayPos;
        int col = 0;
        int day = 0;
        string cellValue = "";

        for (int idx = 0; idx < totalDaysInMonth; idx++)
        {
            if (col == 0)
            {
                control.Append("<tr>\n");
            }

            if (idx >= dayPos)
            {
                ++day;

                if (_viewFile == "")
                {
                    cellValue = _onDayRenderFunc != null ? _onDayRenderFunc(new DateTime(_year, _month, day), true) : day.ToString();
                }
                else
                {
                    ViewData.Model = new CalendarArg() { Date = new DateTime(_year, _month, day), SelectedDate = _selectedDate, CurrentMonth = true };
                    cellValue = this.Parse(_viewFile);
                }

                control.Append(string.Format("<td data-day=\"{0}\" data-month=\"{1}\" data-year=\"{2}\">{3}</td>\n", day, _month, _year, cellValue));
            }
            else
            {
                if (_viewFile == "")
                {
                    cellValue = _onDayRenderFunc != null ? _onDayRenderFunc(new DateTime(pYear, pMonth, daysInPrevMonth), false) : daysInPrevMonth.ToString();
                }
                else
                {
                    ViewData.Model = new CalendarArg() { Date = new DateTime(pYear, pMonth, daysInPrevMonth), SelectedDate = _selectedDate, CurrentMonth = false };
                    cellValue = this.Parse(_viewFile);
                }

                control.Append(string.Format("<td>{0}</td>\n", cellValue));
                ++daysInPrevMonth;
            }

            if (col == 6)
            {
                control.Append("</tr>\n");
                col = 0;
                continue;
            }
            ++col;
        }

        if (col < 7)
        {
            int nextMonthDay = 1;

            for (int c = col; c < 7; c++)
            {
                if ((_month + 1) > 12)
                {
                    ++_year;
                    _month = 1;
                }
                else
                {
                    ++_month;
                }

                if (_viewFile == "")
                {
                    cellValue = _onDayRenderFunc != null ? _onDayRenderFunc(new DateTime(_year, _month, nextMonthDay), false) : nextMonthDay.ToString();
                }
                else
                {
                    ViewData.Model = new CalendarArg() { Date = new DateTime(_year, _month, nextMonthDay), SelectedDate = _selectedDate, CurrentMonth = false };
                    cellValue = this.Parse(_viewFile);
                }

                control.Append(string.Format("<td>{0}</td>\n", cellValue));
                ++nextMonthDay;
            }

            control.Append("</tr>\n");
        }
        control.Append("</tbody>\n</table>\n");
        return control.ToString();
    }

    private string Parse(string viewFile)
    {
        using (var sw = new StringWriter())
        {
            ControllerContext ctx = new System.Web.Mvc.ControllerContext();
            ctx.HttpContext = new HttpContextWrapper(HttpContext.Current);

            RazorView view = new RazorView(ctx, viewFile, "", false, null);
            TempDataDictionary tdd = new TempDataDictionary();

            var viewContext = new ViewContext(ctx, view, ViewData, tdd, sw);

            view.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }
}
public class CalendarArg
{
    public DateTime SelectedDate { get; set; }
    public DateTime Date  { get; set; }
    public bool CurrentMonth  { get; set; }
    public bool CompletionRequested { get; set; }
    public DateTime CompletedToday { get; set; }
}
View.CalendarIndex.cshtml

<style>
    table {
        width: 100%;
        border: 0px;
        border-collapse: collapse;
        border: 1px solid #EEE;
    }

        table thead tr th {
            font-family: Tahoma;
            font-weight: normal;
            color: #666;
        }

        table tbody tr td {
            border: 1px solid #EEE;
            width: 14%;
        }

            table tbody tr td .cell1, .cell2 {
                min-height: 150px;
                height: 100%;
            }

            table tbody tr td .selected_day h2 {
                Color: #FFF;
                background-color: #3498DB;
                text-shadow: none;
            }

            table tbody tr td .cell1 {
                background-color: #FFF;
            }

                table tbody tr td .cell1:hover h2 {
                    box-shadow: 1px 2px 3px #999;
                }

            table tbody tr td .cell2 {
                background-color: #FCFCFC;
            }

                table tbody tr td .cell2 h2 {
                    color: #CCC;
                }

            table tbody tr td h2 {
                font-family: Tahoma;
                font-size: 20px;
                font-weight: normal;
                float: right;
                margin: 0px;
                padding: 6px;
                color: #154B67;
                background-color: #EEE;
                display: block;
                width: 25px;
                height: 25px;
                text-align: center;
                text-shadow: 2px 1px #FFF;
            }

            table tbody tr td .evt {
                font-family: Tahoma;
                font-size: 12px;
                margin: 5px;
                padding: 10px;
                color: #FFF;
                border-radius: 2px;
            }

            table tbody tr td .clear {
                clear: both;
            }

    .Meeting {
        background-color: #DDD;
        color: #222 !important;
    }

    .Personal {
        background-color: #3498DB;
    }

    .Vacation {
        background-color: #2ECC71;
    }

    .Appointment {
        background-color: #F5AB35;
    }

    .Critical {
        background-color: #F22613;
    }
</style>@Html.Raw(ViewBag.calendar)
    @model Project.Models.CalendarArg
    @{
        CalendarArg calArg = this.Model;
        List<Project.Controllers.Event> events = (List<Project.Controllers.Event>)ViewData["events"];


        string cssClass = calArg.CurrentMonth == true ? "cell1" : "cell2";
    }

    @if (calArg.Date.Day == calArg.SelectedDate.Day)
    {
        cssClass += " selected_day";
    }

@if (calArg.Date.Day == calArg.Date.Day)
{
    if (DateTime.Now <= calArg.Date)
    {
        @Html.CheckBoxFor(m => m.CompletionRequested, new { @checked = calArg.CompletionRequested });
    }
}

    <div class="@cssClass">
        <h2>@calArg.Date.Day.ToString()</h2>
        <div class="clear"></div>

            @foreach (var evt in events)
            {
                if (evt.EventDate.Date.ToString("yyyyMMdd") == calArg.Date.ToString("yyyyMMdd"))
                {
                    <div class="evt @evt.Type.ToString()">@evt.Title</div>
                }
            }
        </div>

它出人意料地起作用,因此我想知道如何更改
日历索引中的css样式表,使复选框与日历设计保持一致(即与日历内联,而不仅仅在其上方),以及如何将对bool的更改保存到db中。

在foreach循环中包含以下内容:

    @Html.CheckBoxFor(m => m.CompletionRequested , new { @checked = evt.CompletionRequested });
更新: 在评论中回答您的问题。执行HttpPost到控制器并传递模型数据

[HttpPost]
public ActionResult CalendarIndex(CalendarArg model)
{
     // Check that model is valid
    if(ModelState.IsValid)
    {
        // CODE here to update Database
        return RedirectToAction("Index"); // or where ever you want to go
    }
    else
    {
        return View(model); // Return back to View, model is not valid
    }
}
更新2:

如果要添加类名,可以这样做:

@Html.CheckBoxFor(m => m.CompletionRequested , new { @checked = evt.CompletionRequested, @class = "checkbox" });
input[type="radio"]:checked
{
      // css when radio button is selected
}

input[type="radio"]
{
      // css when radio button is not selected
}
或者您可以像这样添加css:

@Html.CheckBoxFor(m => m.CompletionRequested , new { @checked = evt.CompletionRequested, @class = "checkbox" });
input[type="radio"]:checked
{
      // css when radio button is selected
}

input[type="radio"]
{
      // css when radio button is not selected
}
这些CSS样式是全局的,因此每个输入元素都会使用类型radio来获取样式


当您想更改对db上下文的更改时,首先需要从上下文中找到当前的更改。然后将true值添加到CompletionRequested属性,然后从上下文中调用SaveChanged方法。您的第一个问题是在calendarView上获取复选框,而不是如何将更改保存到db。这是另一个问题。

@PaulZahra,谢谢。你是说这可以从控制器上完成吗?似乎是的,使用DayRender事件。您可以使用示例中的add-literal将标记放在那里。。。你能分享你的事件控制器吗,这样我就可以让示例n检查问题以及calendar.ViewData.Add(“事件”,事件)下的事件是什么;这是给我的错误谢谢,但这只是抛出了一个例外,事件系统不是控制日历中填充的日期的系统,加上
CompletionRequested
不是控制器中
event
的一部分。我在您的建议方面取得了一些进展,我使用了您的行并将其放在这个if语句中,令人惊讶的是,它奏效了<代码>@if(calArg.Date.Day==calArg.Date.Day){@Html.CheckBoxFor(m=>m.CompletionRequested,new{@checked=calArg.CompletionRequested});}
我现在觉得有点傻了。大约1点我该怎么走。是否将这些更改保存到数据库?二,。将其放入css类中,使其与日历中的日期保持一致?您可以使用数据向控制器发送HttpPost。我用最新代码更新了问题,但仍然没有更新到db。CalendarArgs也没有在服务器资源管理器中创建表。如果您首先使用带有代码的EntityFramework,它应该为您填充表。您应该用数据库问题创建一个新问题