Я пытаюсь написать класс в asp.NET MVC 5, который автоматически добавит данные в мою модель, когда пользователь нажимает кнопку на представлении. В частности, данные являются отметкой даты в одном столбце базы данных и отметкой времени в другом столбце. Так, например, база данных выглядит примерно так:
Day TimeIn TimeOut
У меня есть две кнопки: ClockIn и ClockOut. первая должна быть в состоянии вставить в столбцы Day и TimeIn, в то время как ClockOut проверит текущий день на базе базы данных и добавит текущее время, которое пользователь отключает. Вот класс, который у меня до сих пор находится в контроллере
// Post: Amember1/ClockInOut/ClockIn
[HttpPost, ActionName("ClockIn")]
public ActionResult ClockInConfirm()
{
string today = DateTime.Now.ToShortDateString();
db.TimeClock.SqlQuery("INSERT INTO TimeClock(Day) VALUES [today]");
db.SaveChanges();
return RedirectToAction("Index");
}
Вот вид
@model IEnumerable<AteamR2.Models.Amember1>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Day)
</th>
<th>
@Html.DisplayNameFor(model => model.TimeIn)
</th>
<th>
@Html.DisplayNameFor(model => model.TimeOut)
</th>
<th></th>
</tr>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Day)
</td>
<td>
@Html.DisplayFor(modelItem => item.TimeIn)
</td>
<td>
@Html.DisplayFor(modelItem => item.TimeOut)
</td>
<td>
<div class="ClockIn">
<input type="submit" value="ClockIn" class="buttonIn" />
</div>
<div class="ClockOut">
<input type="submit" value="ClockOut" class="buttonIn" />
</div>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
}
</table>
Я не совсем уверен, где моя проблема, но я считаю, что это должно быть нечто, что
Проблема заключается в способе выполнения SQL-запроса.
Лучшей практикой является использование SqlParameter:
string day = DateTime.Now.ToShortDateString();
string time = DateTime.Now.ToShortTimeString();
string test = "insert into timeclock(day, time) values (@p1, @p2)";
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@p1", day));
parameters.Add(new SqlParameter("@p2", time));
db.Database.ExecuteSqlCommand(test, parameters.ToArray());
Лучший способ сделать это - просто позволить EF построить SQL-запрос для вас:
db.TimeClock.Add(new TimeClock() { Day = day, Time = time });
db.SaveChanges();