Asp.net mvc ASP.NET MVC-表未更新
我的应用程序允许用户将即将到来的事件从列表添加到个人日历中。个人日历作为一个表实现,在所有用户之间共享,该表将Asp.net mvc ASP.NET MVC-表未更新,asp.net-mvc,Asp.net Mvc,我的应用程序允许用户将即将到来的事件从列表添加到个人日历中。个人日历作为一个表实现,在所有用户之间共享,该表将字符串UserID值链接到int EventID,并使用单独的int UserCalendarID作为主键 但是,在调用操作时,表不会更新;行动如下: [HttpPost] public IActionResult AddToCalendar(int ID) { var events = context.Events.ToList();
字符串UserID
值链接到int EventID
,并使用单独的int UserCalendarID
作为主键
但是,在调用操作时,表不会更新;行动如下:
[HttpPost]
public IActionResult AddToCalendar(int ID)
{
var events = context.Events.ToList();
Event _e = events.FirstOrDefault(x => x.EventID == ID);
var calendars = context.Calendars.ToList();
UserCalendar c = new UserCalendar
{
UserID = userManager.GetUserAsync(HttpContext.User).Result.UserName,
EventID = _e.EventID
};
calendars.Add(c);
context.SaveChanges();
return View("Index");
}
以下是将事件添加到事件表的(工作)代码供参考:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> NewEvent(Models.NewEventViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var newEvent = new Event {
Artist = await userManager.GetUserAsync(HttpContext.User),
EventName = model.EventName,
Time = model.Time,
Venue = model.Venue,
GenreID = model.GenreID
};
var events = context.Events;
events.Add(newEvent);
context.SaveChanges();
ViewBag.Notification = "Your event has been added.";
ViewBag.Color = "Green";
}
else {
ViewBag.Notification = "Something went wrong — Event not added.";
ViewBag.Color = "Red";
}
return View("Index");
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务NewEvent(Models.NewEventViewModel,字符串returnUrl=null)
{
ViewData[“ReturnUrl”]=ReturnUrl;
if(ModelState.IsValid)
{
var newEvent=新事件{
Artist=await userManager.GetUserAsync(HttpContext.User),
EventName=model.EventName,
时间=模型时间,
地点=模型。地点,
GenreID=model.GenreID
};
var events=context.events;
events.Add(newEvent);
SaveChanges();
ViewBag.Notification=“您的事件已添加。”;
ViewBag.Color=“绿色”;
}
否则{
ViewBag.Notification=“出现问题-未添加事件。”;
ViewBag.Color=“红色”;
}
返回视图(“索引”);
}
我没有为AddToCalendar使用ViewModel的原因是没有专门针对它的视图;相反,它是由EventDetails页面上表单中的按钮触发的,该页面定义如下:
@model Event
@{
ViewData["Title"] = "Event Details";
Event e = ViewBag.Event;
}
<h2>@ViewData["Title"]</h2>
<p><b>Event Name: </b>@e.EventName</p>
<p><b>Artist: </b>@e.Artist.ClientName</p>
<p><b>Date and Time: </b>@e.Time</p>
<p><b>Genre: </b>@e.Genre.GenreName</p>
<p><b>Venue: </b>@e.Venue</p>
@if (ViewBag.isYours)
{
<a asp-action="DeleteEvent" asp-controller="Home" class="btn btn-danger" asp-route-id=@e.EventID>DELETE</a>
<a asp-action="EditEvent" asp-controller="Home" class="btn btn-success" asp-route-id=@e.EventID>EDIT</a>
}
<form asp-action="AddToCalendar" asp-controller="Home" asp-route-id=@e.EventID asp-route-returnurl="@ViewData["ReturnUrl"]">
<input type="submit" value="Add To Your Calendar" class="btn btn-default" />
</form>
@model事件
@{
ViewData[“Title”]=“事件详细信息”;
事件e=视图包事件;
}
@ViewData[“标题”]
事件名称:@e.EventName
艺术家:@e.Artist.ClientName
日期和时间:@e.Time
流派:@e.Genre.GenreName
地点:@e.venture
@如果(ViewBag.isYours)
{
删除
编辑
}
我已经确认
c
正在添加到日历中。为什么AddToCalendar事件不会导致表更新?注意,当您从数据库上下文获取日历时,您正在调用:
var calendars = context.Calendars.ToList();
这会将UserCalendar对象列表加载到内存中。这不会跟踪数据库中的实际日历表。将事件添加到事件表时,将获得如下所示的事件表对象:
var events = context.Events;
注意,没有对“ToList()”的调用,这意味着您正在添加对“Events”的实际上下文对象的引用,而不仅仅是内存中的列表
如果从获取日历的调用中删除.ToList(),它将跟踪数据库上下文对象,就像在获取事件对象的调用中一样。这应该可以解决您的问题。您正在将“c”添加到内存中的列表中,而不是数据库的实际上下文中。尝试使用context.Calendars.Add(c)。在您调用context.SaveChanges()之后,它应该会更新。抱歉,我错过了您在下面使用“事件”的方式。如果您想以同样的方式使用它,只需从以下行中删除ToList():var calendars=context.calendars.ToList()。这应该跟踪数据库上下文对象,而不是从ToList()返回的列表。第二个选项有效;你能考虑把它作为答案,以便我能接受吗?我会把它寄出去。很高兴它成功了!