Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC-表未更新_Asp.net Mvc - Fatal编程技术网

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()返回的列表。第二个选项有效;你能考虑把它作为答案,以便我能接受吗?我会把它寄出去。很高兴它成功了!