C# 在单击按钮时将Html.DropdownListFor值传递给其他视图
我正在尝试在MVC中创建一个小型预订系统。现在我已经创建了一个模型(BookingViewModel)一个控制器(BookingController)和一个包含下拉列表和按钮的视图 用户将通过多个步骤(视图)完成预订。BookingController中的索引视图是第一步 因此,下一步是座位(用户可以指向他想要坐的座位)。在这里,我考虑创建另一个控制器,并创建一个索引视图。如何从第一个索引视图获取此步骤的值 我知道我应该使用Httppost方法,但现在我遇到了一个错误: 具有键“DepartureRoute”的ViewData项的类型为“System.String”,但必须为“IEnumerable”类型 因此,根据您在第一步中输入的值,我希望在下一步中使用这些值,以便搜索数据库 预订控制器C# 在单击按钮时将Html.DropdownListFor值传递给其他视图,c#,asp.net-mvc,C#,Asp.net Mvc,我正在尝试在MVC中创建一个小型预订系统。现在我已经创建了一个模型(BookingViewModel)一个控制器(BookingController)和一个包含下拉列表和按钮的视图 用户将通过多个步骤(视图)完成预订。BookingController中的索引视图是第一步 因此,下一步是座位(用户可以指向他想要坐的座位)。在这里,我考虑创建另一个控制器,并创建一个索引视图。如何从第一个索引视图获取此步骤的值 我知道我应该使用Httppost方法,但现在我遇到了一个错误: 具有键“Departur
namespace BookingMvc.Controllers
{
public class BookingController : Controller
{
// GET: Booking
public ActionResult Index()
{
var vm = new BookingViewModel();
var citiesList = new List<SelectListItem>
{
new SelectListItem { Value = "1", Text = "Oslo to Copenhagen" },
new SelectListItem { Value = "2", Text = "Copenhagen to Oslo" },
new SelectListItem { Value = "2", Text = "Copenhagen to Stockholm" },
new SelectListItem { Value = "3", Text = "Stockholm to Copenhagen" },
new SelectListItem { Value = "1", Text = "Oslo to Stockholm" },
new SelectListItem { Value = "3", Text = "Stockholm to Oslo" },
};
var numberList = new List<SelectListItem>
{
new SelectListItem { Value = "0", Text = "0" },
new SelectListItem { Value = "1", Text = "1" },
new SelectListItem { Value = "2", Text = "2"}
};
vm.Cities = citiesList;
vm.Number = numberList;
return View(vm);
}
[HttpPost]
public ActionResult Index(BookingViewModel vm)
{
if (ModelState.IsValid)
{
}
return View(vm);
}
}
}
namespace BookingMvc.Controllers
{
公共类BookingController:控制器
{
//获取:预订
公共行动结果索引()
{
var vm=新BookingViewModel();
var citiesList=新列表
{
新建SelectListItem{Value=“1”,Text=“奥斯陆到哥本哈根”},
新建SelectListItem{Value=“2”,Text=“哥本哈根到奥斯陆”},
新建SelectListItem{Value=“2”,Text=“哥本哈根到斯德哥尔摩”},
新建SelectListItem{Value=“3”,Text=“斯德哥尔摩到哥本哈根”},
新建SelectListItem{Value=“1”,Text=“奥斯陆至斯德哥尔摩”},
新建SelectListItem{Value=“3”,Text=“斯德哥尔摩到奥斯陆”},
};
var numberList=新列表
{
新建SelectListItem{Value=“0”,Text=“0”},
新建SelectListItem{Value=“1”,Text=“1”},
新建SelectListItem{Value=“2”,Text=“2”}
};
vm.Cities=城市列表;
vm.Number=numberList;
返回视图(vm);
}
[HttpPost]
公共行动结果索引(BookingViewModel vm)
{
if(ModelState.IsValid)
{
}
返回视图(vm);
}
}
}
预订视图模型
namespace BookingMvc.Models
{
public class BookingViewModel
{
public string departureroute { get; set; }
public string returnroute { get; set; }
public DateTime departuredate { get; set; }
public DateTime returndate { get; set; }
public int adults { get; set; }
public int childrens { get; set; }
//Enum lists
public IEnumerable<SelectListItem> Cities { get; set; }
public IEnumerable<SelectListItem> Number { get; set; }
}
}
namespace BookingMvc.Models
{
公共类BookingViewModel
{
公共字符串departureroute{get;set;}
公共字符串returnroute{get;set;}
public DateTime departuredate{get;set;}
public DateTime returndate{get;set;}
公共整数{get;set;}
public int childrens{get;set;}
//枚举列表
公共IEnumerable城市{get;set;}
公共IEnumerable数{get;set;}
}
}
第1步“索引视图”
@使用(Html.BeginForm())
{
@Html.Label(“发送路线”)
@DropDownListFor(m=>m.departureroute,Model.Cities,new{@class=“dropdownlist”})
@Html.Label(“出发日期”)
@TextBox(“Name”,null,new{@class=“dropdownlist”})
@Html.Label(“成人”)
@DropDownListFor(m=>m.成人,Model.Number,新{@class=“dropdownlist”})
@Html.Label(“返回路线”)
@DropDownListFor(m=>m.returnroute,Model.Cities,new{@class=“dropdownlist”})
@Html.Label(“返回日期”)
@TextBox(“Name”,null,new{@class=“dropdownlist”})
@Html.Label(“子项”)
@DropDownListFor(m=>m.childrens,Model.Number,new{@class=“dropdownlist”})
@Html.Label(“预订信息”)
继续
}
希望有人能告诉我,为了获得下一步的值(视图)在您的POST方法中,您有
返回视图(vm)
,但您不重新填充模型。城市
选择列表,使其为空
。因为它的null
所以DropDownListFor()
方法的回退是departureroute
必须是IEnumerable
,但它不是(它的string
),因此出现了错误。那么您建议我怎么做呢?在返回视图(vm)行之前
您需要重新填充选择列表
,就像您在GET方法中所做的那样,这将防止该错误。但是您的代码中仍然存在多个其他错误,例如,您有2个@Html.TextBox(“Name”,…)
,它们正在生成与您的模型没有关系的控件(并生成无效的Html)。创建非标签的
元素(单击它们不会将焦点设置为关联控件)
@using (Html.BeginForm())
{
<div class="col-sm-4">
@Html.Label("Outgoing route") <br />
@Html.DropDownListFor(m => m.departureroute, Model.Cities, new { @class = "dropdownlist" })
<br />
@Html.Label("Departure date") <br />
<div>
@Html.TextBox("Name", null, new { @class = "dropdownlist" })
</div>
<br />
@Html.Label("Adult") <br />
@Html.DropDownListFor(m => m.adults, Model.Number, new { @class = "dropdownlist" })
</div>
<div class="col-sm-4">
@Html.Label("Return route") <br />
@Html.DropDownListFor(m => m.returnroute, Model.Cities, new { @class = "dropdownlist" })
<br />
@Html.Label("Return date") <br />
<div>
@Html.TextBox("Name", null, new { @class = "dropdownlist" })
</div>
<br />
@Html.Label("Children") <br />
@Html.DropDownListFor(m => m.childrens, Model.Number, new { @class = "dropdownlist" })
</div>
<div class="col-sm-4">
<div class="bookinginfomation">
@Html.Label("Booking information") <br />
<button type="submit" class="bookingbutton">Continue</button>
</div>
</div>
}