C# mvc在一个页面中使用多个表单,通过选择单选按钮进行过滤
我有一个包含3个表单的页面,每个表单的显示取决于上一个表单中单选按钮的选定值(我使用viewbag控制可见性,希望找到更好的)所有这些表单都使用相同的视图模型。是否可以将这3个表单发布到同一个操作,并使视图模型保存所有选定的值,以便发送到另一个页面,甚至存储在数据库中?我尝试这样做,在每次发布之后,旧的选定值在ViewModel中变为null。 我还尝试了发布的解决方案,但仍然无法在ViewModel中保存所有选定值,因此,存储选定值以供以后使用的最佳方法是什么 RouteList.cs我的视图模型C# mvc在一个页面中使用多个表单,通过选择单选按钮进行过滤,c#,asp.net-mvc,radiobuttonlist,C#,Asp.net Mvc,Radiobuttonlist,我有一个包含3个表单的页面,每个表单的显示取决于上一个表单中单选按钮的选定值(我使用viewbag控制可见性,希望找到更好的)所有这些表单都使用相同的视图模型。是否可以将这3个表单发布到同一个操作,并使视图模型保存所有选定的值,以便发送到另一个页面,甚至存储在数据库中?我尝试这样做,在每次发布之后,旧的选定值在ViewModel中变为null。 我还尝试了发布的解决方案,但仍然无法在ViewModel中保存所有选定值,因此,存储选定值以供以后使用的最佳方法是什么 RouteList.cs我的视图
public class RoutesList
{
public int ID { get; set; }
public List<Route> Routes
{
get
{
Queries.BookingHandler handler = new Queries.BookingHandler();
return handler.GetAllRoutes();
}
set { }
}
public List<Route> OppositeRoutes
{
get
{
Queries.BookingHandler handler = new Queries.BookingHandler();
return handler.GetRoutDirections(long.Parse(SelectedRouteID));
}
set { }
}
public List<RouteStation> RouteStations
{
get
{
Queries.BookingHandler handler = new Queries.BookingHandler();
return handler.GetRouteStations(long.Parse(SelectedOppositeRouteID));
}
set { }
}
public string SelectedRouteID { get; set; }
public string SelectedOppositeRouteID { get; set; }
public string SelectedFromStationID { get; set; }
public string SelectedToStationID { get; set; }
public int Count { get; set; }
}
和my View Index.cshtml
@model BusStarBackend.Models.RoutesList
@using (Html.BeginForm())
{
<table class="table table-hover">
<tr>
<th>Trips</th>
<th>Price</th>
</tr>
@foreach (var item in Model.Routes)
{
<tr>
<td>
@Html.RadioButtonFor(m => m.SelectedRouteID, item.RouteID)
@Html.DisplayFor(model => item.RouteName)
</td>
<td>@Html.DisplayFor(m => item.TicketPrice)</td>
<td> </td>
</tr>
}
</table>
<input type="submit" value="next" class="btn btn-default" />
}
@{
using (Html.BeginForm())
{
if (ViewBag.isDirection != null && ViewBag.isDirection)
{
<table class="table">
<tr>
<th>
Please selected your Direction
</th>
<th></th>
</tr>
@foreach (var item in Model.OppositeRoutes)
{
<tr>
<td>
@Html.RadioButtonFor(m => Model.SelectedOppositeRouteID, item.RouteID)
@Html.DisplayFor(modelItem => item.RouteName)
</td>
</tr>
}
</table>
<input type="submit" value="next" class="btn btn-default" />
}
}
}
@{
if (ViewBag.isStations != null && ViewBag.isStations)
{
using (Html.BeginForm())
{
<div id="stations">
<table class="table">
<tr>
<th>
From Station
</th>
<th>
To Station
</th>
<th></th>
</tr>
@foreach (var item in Model.RouteStations)
{
<tr>
<td>
@Html.RadioButtonFor(model => model.SelectedFromStationID, item.StationID)
@Html.DisplayFor(modelItem => item.Station.Name)
</td>
<td>
@Html.RadioButtonFor(model => model.SelectedToStationID, item.StationID)
@Html.DisplayFor(modelItem => item.Station.Name)
</td>
</tr>
}
</table>
<input type="submit" value="next" class="btn btn-default" />
</div>
}
}
}
@model bustarbackend.Models.RoutesList
@使用(Html.BeginForm())
{
旅行
价格
@foreach(Model.Routes中的变量项)
{
@Html.radioButton(m=>m.SelectedRouteID,item.RouteID)
@DisplayFor(模型=>item.RouteName)
@DisplayFor(m=>item.TicketPrice)
}
}
@{
使用(Html.BeginForm())
{
if(ViewBag.isDirection!=null&&ViewBag.isDirection)
{
请选择您的方向
@foreach(模型中的var项。反向路由)
{
@Html.radioButton(m=>Model.SelectedOppositeRouteID,item.RouteID)
@DisplayFor(modelItem=>item.RouteName)
}
}
}
}
@{
if(ViewBag.isStations!=null&&ViewBag.isStations)
{
使用(Html.BeginForm())
{
从车站
驻扎
@foreach(Model.RouteStations中的var项)
{
@Html.radioButton(model=>model.SelectedFromStationID,item.StationID)
@DisplayFor(modelItem=>item.Station.Name)
@Html.radioButton(model=>model.selectedStationId,item.StationID)
@DisplayFor(modelItem=>item.Station.Name)
}
}
}
}
对于“最简单”的修复,您应该在开始表单之前使用“如果”,如下所示:
@model BusStar.Models.RoutesList
@if (ViewBag.isDirection != null && ViewBag.isDirection)
{...
@using (Html.BeginForm())
{.....
为了获得更好的解决方案,您应该使用“Html.Action”方法,构建包含每个表单的局部视图,并根据单选按钮的值仅呈现所需的表单
大概是这样的:
@model BusStar.Models.RoutesList
@if (ViewBag.isDirection != null && ViewBag.isDirection)
{...
@using (Html.BeginForm())
{.....
每个表单有2个部分视图-这是针对方向表单的:(称为_directionForm.cshtml)
在您以前的观点中,将这两种形式替换为:
Html.Action("PartialForm", Model)
对不起,我是mvc的初学者,你能帮助我如何根据单选按钮的值渲染我的局部视图吗?这里有很多路径可供选择,我将尝试演示一种可能更适合初学者的路径。我建议在你研究ajax的解决方案之后。我会照你说的做,但是在PartialForm中,你希望我呈现哪个其他视图?你是指其他的部分视图?如果是这样的话,我必须做另一个条件,那么在默认情况下我可以返回什么呢?您需要两个部分-一个用于方向形式,一个用于站形式,带有条件。默认情况下,应返回空-->返回新的EmptyResult();并考虑JavaScript解决方案。只需将每个表单添加到视图中,并从所需单选按钮切换所需“更改”事件的显示。
public ActionResult Index()
{
return View(new RoutesList());
}
public ActionResult PartialForm(RoutesList route)
{
if (!string.IsNullOrEmpty(route.SelectedRouteID))
return view("__directionForm", route);
return view("...", route); //your other view
}
[HttpPost]
public ActionResult Index(RoutesList route, FormCollection frm)
{
//if (!string.IsNullOrEmpty(route.SelectedRouteID)) ViewBag.isDirection = true;
//if (!string.IsNullOrEmpty(route.SelectedOppositeRouteID)) ViewBag.isStations = true;
if(!string.IsNullOrEmpty(route.SelectedFromStationID)&&!string.IsNullOrEmpty(route.SelectedToStationID))
return RedirectToAction("Index", "Time", new { id = route.SelectedRouteID });
return View(route);
}
Html.Action("PartialForm", Model)