C# 如何在此日历视图中每天添加复选框?
我试图在日历视图中的每一天添加一个简单的复选框功能。它必须与当前日历的样式内联,并且当选择bool时,它必须能够将更改保存到数据库。如有任何建议,将不胜感激 我目前的主要问题是选中的复选框没有保存到数据库中 控制器.csC# 如何在此日历视图中每天添加复选框?,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
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,它应该为您填充表。您应该用数据库问题创建一个新问题