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 将模型添加到另一个&x27;MVC5中的s模型列表_Asp.net Mvc_Model View Controller_Asp.net Mvc 5 - Fatal编程技术网

Asp.net mvc 将模型添加到另一个&x27;MVC5中的s模型列表

Asp.net mvc 将模型添加到另一个&x27;MVC5中的s模型列表,asp.net-mvc,model-view-controller,asp.net-mvc-5,Asp.net Mvc,Model View Controller,Asp.net Mvc 5,因此,我在MVC5中使用“航班订单管理系统”时遇到困难 我试图做的是使用特定问题中给出的要求将现有乘客添加到航班中 必须使用列表 这是我的代码: 航班: public class Flight { public int Id { get; set; } public string Depart { get; set; } public string Destination { get; set; } public D

因此,我在MVC5中使用“航班订单管理系统”时遇到困难

我试图做的是使用特定问题中给出的要求将现有乘客添加到航班中

  • 必须使用列表
这是我的代码:

航班:

public class Flight
    {
        public int Id { get; set; }

        public string Depart { get; set; }
        public string Destination { get; set; }

        public DateTime TakeOffTime { get; set; }
        public DateTime LandingTime { get; set; }

        public virtual List<Passenger> Passengers { get; set; }
    }
我们需要在索引页面(显示所有航班)和详细信息页面的重定向链接上进行重定向,管理员可以在其中向航班添加乘客。他通过使用现有乘客的下拉列表和“添加”按钮来实现这一点

但是,按下“添加”按钮后,需要弹出一个表格,显示其重定向到的航班上的所有乘客

我将如何处理这个问题?我已经安装了以下控制器:

 public ActionResult Details()
        {

            ViewBag.PassengerId = new SelectList(db.Passengers, "Id", "Name");

            return View();
        }

        [HttpPost]
        public ActionResult Details(int passengerId)
        {

            Passenger = db.Passegers.Find(passengerId);
            if(ModelState.IsValid)
            {
                //add the passenger to the selected flight that it redirected to, but how to get the id of it now?
            }

        //Get all passengers of the flight, how to get the id?
            List<Passagier> Passagiers = db.Passagiers.ToList();

            return View(Passagiers);
        }
public ActionResult详细信息()
{
ViewBag.PassengerId=新选择列表(db.passers,“Id”,“Name”);
返回视图();
}
[HttpPost]
公共行动结果详细信息(int passengerId)
{
乘客=db.Passegers.Find(passengerId);
if(ModelState.IsValid)
{
//将乘客添加到其重定向到的所选航班,但现在如何获取其id?
}
//把所有的乘客都弄到飞机上,怎么弄到身份证?
List Passagiers=db.Passagiers.ToList();
返回视图(乘客);
}
我的详细信息视图:

@using (Html.BeginForm("Details", "Home", FormMethod.Post))
{
    @Html.DropDownList("passengerId", (SelectList)ViewBag.PassengersId);
    <input type="submit" value="Add" />
}
@使用(Html.BeginForm(“Details”,“Home”,FormMethod.Post))
{
@Html.DropDownList(“passengerId”,(SelectList)ViewBag.PassengersId);
}
我不能使用相关答案给我的任何东西(viewModel,ienumerable,…),因此我问这个问题

如何将页面的当前路由id(flightID)和PassengerID传递给控制器操作?有什么好办法


我快到了,我想是因为重定向起作用了,我的下拉列表也显示了所有乘客。

首先,应该反对任何禁止良好设计的要求。项目负责人付钱给开发人员是因为他们自己没有必要的技能。作为开发人员,您的工作是在有不合理的需求时教育项目所有者。如果项目负责人不顾你的抗议,坚持做一些根本错误的事情,那么这对你来说就是一个象扔石头一样扔下它们的信号。它们只会给你带来麻烦。不要害怕解雇客户。海里有很多鱼,但是一个坏客户会成为你脖子上的锚

也就是说,您可能只是误解了需求。虽然有些地方您可以使用
List
,甚至可能应该使用
List
,但您的数据库持久化实体并不是其中之一。它必须是
i集合
。时期实体框架不会持久化
列表
的属性

这就是视图模型的用武之地,因为您的视图模型可以而且应该使用
列表
,然后您可以将其来回映射到实体上的
ICollection
。同样,如果要求禁止使用视图模型,那么您的客户机要么没有信息,要么愚蠢。你的职责是确保他们被告知,如果结果证明他们只是愚蠢的,那么就放弃他们

接下来,每当您有一个要发布的内容列表时,您需要使用
ListBoxFor
,而不是
DropDownListFor
。后者只允许一次选择,但在这里您需要保留多个乘客。在视图模型上,应具有如下属性:

public List<int> SelectedPassengerIds { get; set; }
然后,设置
PassengerOptions

model.PassengerOptions = db.Passengers.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Name });
最后,在您看来,您将拥有:

@Html.ListBoxFor(m => m.SelectedPassengerIds, Model.PassengerOptions)
在post中,您需要将视图模型中相应的post值映射回您的
航班
实体。对于您的
乘客
收集,您将执行以下操作:

// Remove deselected passengers
flight.Passengers.Where(m => !model.SelectedPassengerIds.Contains(m.Id)).ToList()
    .ForEach(m => flight.Passengers.Remove(m));

// Add newly selected passengers
var newPassengerIds = model.SelectedPassengerIds.Except(flight.Passengers.Select(m => m.Id));
db.Passengers.Where(m => newPassengerIds.Contains(m.Id)).ToList()
    .ForEach(m => flight.Passengers.Add(m));

首先,应该反对任何禁止良好设计的要求。项目负责人付钱给开发人员是因为他们自己没有必要的技能。作为开发人员,您的工作是在有不合理的需求时教育项目所有者。如果项目负责人不顾你的抗议,坚持做一些根本错误的事情,那么这对你来说就是一个象扔石头一样扔下它们的信号。它们只会给你带来麻烦。不要害怕解雇客户。海里有很多鱼,但是一个坏客户会成为你脖子上的锚

也就是说,您可能只是误解了需求。虽然有些地方您可以使用
List
,甚至可能应该使用
List
,但您的数据库持久化实体并不是其中之一。它必须是
i集合
。时期实体框架不会持久化
列表
的属性

这就是视图模型的用武之地,因为您的视图模型可以而且应该使用
列表
,然后您可以将其来回映射到实体上的
ICollection
。同样,如果要求禁止使用视图模型,那么您的客户机要么没有信息,要么愚蠢。你的职责是确保他们被告知,如果结果证明他们只是愚蠢的,那么就放弃他们

接下来,每当您有一个要发布的内容列表时,您需要使用
ListBoxFor
,而不是
DropDownListFor
。后者只允许一次选择,但在这里您需要保留多个乘客。在视图模型上,应具有如下属性:

public List<int> SelectedPassengerIds { get; set; }
然后,设置
PassengerOptions

model.PassengerOptions = db.Passengers.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Name });
最后,在您看来,您将拥有:

@Html.ListBoxFor(m => m.SelectedPassengerIds, Model.PassengerOptions)
在post中,您需要将视图模型中相应的post值映射回您的
航班
实体。对于您的
乘客
收集,您将执行以下操作:

// Remove deselected passengers
flight.Passengers.Where(m => !model.SelectedPassengerIds.Contains(m.Id)).ToList()
    .ForEach(m => flight.Passengers.Remove(m));

// Add newly selected passengers
var newPassengerIds = model.SelectedPassengerIds.Except(flight.Passengers.Select(m => m.Id));
db.Passengers.Where(m => newPassengerIds.Contains(m.Id)).ToList()
    .ForEach(m => flight.Passengers.Add(m));

非常感谢您的详尽回答,普拉特先生。我会尽我所能去理解做什么和不做什么