Asp.net mvc 4 将ID从一个视图传递到另一个视图并将其存储在另一个表中

Asp.net mvc 4 将ID从一个视图传递到另一个视图并将其存储在另一个表中,asp.net-mvc-4,Asp.net Mvc 4,我有一个用于添加节日的创建页面和一个用于用户为该节日创建活动的页面。我正在尝试从传递节日id并将其存储在我的事件表中。它会出现在创建页面的背面。代码如下: 控制器: [HttpGet] public ActionResult Create2(int festID) { EventsVM events = new EventsVM { festivalID = festID }; events.eType = db.EType.ToDictiona

我有一个用于添加节日的创建页面和一个用于用户为该节日创建活动的页面。我正在尝试从传递节日id并将其存储在我的事件表中。它会出现在创建页面的背面。代码如下:

控制器:

[HttpGet]
    public ActionResult Create2(int festID)
    {
        EventsVM events = new EventsVM { festivalID = festID };

        events.eType = db.EType.ToDictionary(p => p.ID, q => q.EType);
        events.eType.Add(-1, "----- Add New Event Type -----");

        events.eventsDate = DateTime.Now;
        events.startTime = DateTime.Now;
        events.endTime = DateTime.Now;

        return View(events);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create2(EventsVM model)
    {
        if (ModelState.IsValid != true)
        {
            if (model.selectedEType != -1)
            {
                //db.save stuff from create.
                Events Newevent = new Events();
                Newevent.EndTime = model.endTime;
                Newevent.StartTime = model.startTime;
                Newevent.EventsDate = model.eventsDate = DateTime.Now;
                Newevent.EventsName = model.EventsName;
                Newevent.EType = db.EType.Where(p => p.ID == model.selectedEType).Single();
                Newevent.Location = model.Location;
                //Caught here!!!
                Newevent.FestivalID = model.festivalID;

                db.Events.Add(Newevent);
                db.SaveChanges();
                return RedirectToAction("Details", "Festival", new { id = model.festivalID });
                //return RedirectToAction("Index", "Festival");
                //return RedirectToAction("Index", "Events");
                //String test = "test3";
            }
            ModelState.AddModelError("", "No Event Type Picked");
        }

        model.eType = db.EType.ToDictionary(p => p.ID, q => q.EType);
        model.eType.Add(-1, "----- Add New Event Type -----");
        model.eventsDate = DateTime.Now;
        model.startTime = DateTime.Now;
        model.endTime = DateTime.Now;

        return View(model);
    }
我必须在所选节日ID的详细信息页面上“保存”节日ID

Details.cshtml-节日

 <div>
<h3>Details for Festival: @Model.FestivalName.ToString()</h3>
</div>
<hr />
<div class="table-responsive">
<!--<div class="table">-->
    <table class="table">
        <tr>
            <th>
                Festival Name
            </th>
            <th>
                Start Date
            </th>
            <th>
                End Date
            </th>
            <th>
                Town
            </th>
            <th>
                County
            </th>
            <th>
                Festival Type
            </th>
            <th>
                Options
            </th>
        </tr>
        <tr>
            <td>
                @Html.DisplayFor(model => model.FestivalName)
            </td>
            <td>
                @Html.DisplayFor(model => model.StartDate)
            </td>
            <td>
                @Html.DisplayFor(model => model.EndDate)
            </td>
            <td>
                @Html.DisplayFor(model => model.FestivalTown.Name)
            </td>
            <td>
                @Html.DisplayFor(model => model.FestivalCounty.Name)
            </td>
            <td>
                @Html.DisplayFor(model => model.FType.FType)
            </td>
            <td>
                <div class="btn-group">
                    @*                        <button class="btn btn-info btn-sm dropdown-toggle" type="button" data-toggle="dropdown">Options</button>*@
                    <button type="button" class="btn btn-info btn-sm dropdown-toggle" data-toggle="dropdown">
                        <span class="caret"></span>
                    </button>
                    <ul class="dropdown-menu">
                        <li role="presentation" class="dropdown-header">Festival</li>
                        <li>@Html.ActionLink("Edit", "Edit2", new { id = Model.FestivalId })</li>
                        <li>@Html.ActionLink("Back to List", "Index")</li>
                    </ul>
                </div>
            </td>
        </tr>
    </table>
</div>
@if (Model.Events != null)
{
    <center><div class="well well-sm" style="width:400px">@Model.FestivalName.ToString() has @Model.Events.Count() Events</div></center>
    @Html.ActionLink("Add Event", "Create2", "Events", new { festID = Model.FestivalId }, new { @class = "btn btn-primary"})
    <br />
    <br />
    <!--<div class="table-responsive">-->
    <div class="table">
        <table class="table table-striped">
            <tr>
                <th>Events Name
                </th>
                <th>Events Date
                </th>
                <th>Start Time
                </th>
                <th>End Time
                </th>
                <th>Options
                </th>
            </tr>

            @foreach (var e in Model.Events)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => e.EventsName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => e.EventsDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => e.StartTime)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => e.EndTime)
                    </td>
                    <td>
                        <div class="btn-group">
                            <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown">
                                <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu">
                                <li role="presentation" class="dropdown-header">Event</li>
                                <li role="presentation" class="divider"></li>
                                <li>@Html.ActionLink("Edit", "Edit2", "Events", new { id = e.ID }, null)</li>
                                <li>@Html.ActionLink("Details", "Details", "Events", new { id = e.ID }, null)</li>
                                <li>@Html.ActionLink("Delete", "Delete", "Events", new { id = e.ID }, null)</li>
                            </ul>
                        </div>
                    </td>
                </tr>
            }

        </table>
    </div>  
}

节日详情:@Model.festitalname.ToString()

节日名称 开始日期 结束日期 城镇 县 节日类型 选择权 @DisplayFor(model=>model.FestivalName) @DisplayFor(model=>model.StartDate) @DisplayFor(model=>model.EndDate) @DisplayFor(model=>model.FestivalTown.Name) @DisplayFor(model=>model.FestivalCounty.Name) @DisplayFor(model=>model.FType.FType) @*选择权*@
  • 节日
  • @ActionLink(“Edit”,“Edit2”,新的{id=Model.FestivalId})
  • @ActionLink(“返回列表”、“索引”)
@如果(Model.Events!=null) { @Model.Festival.ToString()具有@Model.Events.Count()个事件 @ActionLink(“addevent”、“Create2”、“Events”、new{festID=Model.FestivalId}、new{@class=“btn btn primary”})

事件名称 活动日期 开始时间 结束时间 选择权 @foreach(Model.Events中的var e) { @DisplayFor(modeleItem=>e.EventsName) @DisplayFor(modelItem=>e.EventsDate) @DisplayFor(modelItem=>e.StartTime) @DisplayFor(modelItem=>e.EndTime)
  • 事件
  • @ActionLink(“编辑”、“编辑2”、“事件”,新的{id=e.id},null)
  • @ActionLink(“详细信息”、“详细信息”、“事件”,新的{id=e.id},null)
  • @ActionLink(“删除”,“删除”,“事件”,新的{id=e.id},null)
} }

我得到的错误是,当它发回时,链接中的id变为0,因此它不会保存id。关于如何解决此问题的任何id?

id为0,因为您传递的是模型id,而不是EF在保存更改(将更改传播到数据库)并添加到对象集后生成的实体id。因此,Id将自动为您填写。把你的代码改成这个

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create2(EventsVM model)
{
    if (ModelState.IsValid != true)
    {
        if (model.selectedEType != -1)
        {
            //db.save stuff from create.
            Events Newevent = new Events();
            Newevent.EndTime = model.endTime;
            Newevent.StartTime = model.startTime;
            Newevent.EventsDate = model.eventsDate = DateTime.Now;
            Newevent.EventsName = model.EventsName;
            Newevent.EType = db.EType.Where(p => p.ID == model.selectedEType).Single();
            Newevent.Location = model.Location;
            //Caught here!!!
            Newevent.FestivalID = model.festivalID;

            db.Events.Add(Newevent);
            db.SaveChanges();
            //Change the model.festivalID to Newevent.FestivalID
            return RedirectToAction("Details", "Festival", new { id = Newevent.FestivalID });
            //return RedirectToAction("Index", "Festival");
            //return RedirectToAction("Index", "Events");
            //String test = "test3";
        }
        ModelState.AddModelError("", "No Event Type Picked");
    }

    model.eType = db.EType.ToDictionary(p => p.ID, q => q.EType);
    model.eType.Add(-1, "----- Add New Event Type -----");
    model.eventsDate = DateTime.Now;
    model.startTime = DateTime.Now;
    model.endTime = DateTime.Now;

    return View(model);
}

下面是答案:Overmachine

    [HttpGet]
    public ActionResult Create2(int festID)
    {
        EventsVM events = new EventsVM { festivalID = festID };

        events.eType = db.EType.ToDictionary(p => p.ID, q => q.EType);
        events.eType.Add(-1, "----- Add New Event Type -----");

        events.eventsDate = DateTime.Now;
        events.startTime = DateTime.Now;
        events.endTime = DateTime.Now;

        return View(events);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create2(EventsVM model, int festID)
    {
        if (ModelState.IsValid != true)
        {
            if (model.selectedEType != -1)
            {
                //db.save stuff from create.
                Events Newevent = new Events();
                Newevent.EndTime = model.endTime;
                Newevent.StartTime = model.startTime;
                Newevent.EventsDate = model.eventsDate = DateTime.Now;
                Newevent.EventsName = model.EventsName;
                Newevent.EType = db.EType.Where(p => p.ID == model.selectedEType).Single();
                Newevent.Location = model.Location;
                //Caught here!!!
                Newevent.FestivalID = model.festivalID = festID;

                db.Events.Add(Newevent);
                db.SaveChanges();
                //Change the model.festivalID to Newevent.FestivalID
                return RedirectToAction("Details", "Festival", new { id = Newevent.FestivalID });
                //return RedirectToAction("Index", "Festival");
                //return RedirectToAction("Index", "Events");
                //String test = "test3";
            }
            ModelState.AddModelError("", "No Event Type Picked");
        }

        model.eType = db.EType.ToDictionary(p => p.ID, q => q.EType);
        model.eType.Add(-1, "----- Add New Event Type -----");
        model.eventsDate = DateTime.Now;
        model.startTime = DateTime.Now;
        model.endTime = DateTime.Now;

        return View(model);
    }

哪里我已经在创建页面的帖子链接中找到了它?返回重定向到操作(“详细信息”、“节日”,新的{id=model.Festival});这也是我得到的错误:参数字典包含“MyFestival.Controllers.EventsController”中方法“System.Web.Mvc.ActionResult Create2(Int32)”的不可为null类型“System.Int32”的参数“festID”的null条目。可选参数必须是引用类型、可为null的类型或声明为可选参数。该错误是因为您正在向方法操作传递null值,如果要传递的值将为null,有时您可以将方法参数更改为Create(int?id)或Create(int id=0)有关可选参数,请参见我的答案@patrickmelia您更改了什么?您只需复制我的答案,我添加了以下内容:Newevent.FestivalID=model.FestivalID=festID@首先我确实添加了你的代码,但我得到了404,所以我只添加了一点代码,看看它是否工作,它确实工作了,但谢谢你的帮助。