C# MVC 3中的链接控制器行为
是否可以从一个控制器显示一个视图,然后根据用户在dropDownList中选择的内容,将另一个不同的视图渲染回原始调用控制器?一种菊花链效应 这背后的想法-是用户选择一种车辆类型-与视图中的ID号关联,回到控制器中取决于选择的内容,将呈现另一个视图,根据他们选择的车辆类型立即显示HTML,例如汽车、船只或飞机等的HTML页面 如果可能的话,有人能告诉我一个密码吗 实际的数据库模型如下-但它是为文件,而不是车辆C# MVC 3中的链接控制器行为,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,是否可以从一个控制器显示一个视图,然后根据用户在dropDownList中选择的内容,将另一个不同的视图渲染回原始调用控制器?一种菊花链效应 这背后的想法-是用户选择一种车辆类型-与视图中的ID号关联,回到控制器中取决于选择的内容,将呈现另一个视图,根据他们选择的车辆类型立即显示HTML,例如汽车、船只或飞机等的HTML页面 如果可能的话,有人能告诉我一个密码吗 实际的数据库模型如下-但它是为文件,而不是车辆 检查动作方法的方法paremetares,并返回基于该方法的不同视图。像这样的 pub
检查动作方法的方法paremetares,并返回基于该方法的不同视图。像这样的
public ActionResult GetInfo(string id,string vehicleTypId)
{
if(String.IsNullOrEmpty(vehicleTypeId))
{
var vehicle=GetVehicleType(vehicleTypId);
return View("ShowSpecificVehicle",vehicle) ;
}
var genericVehicle=GetVehicle(id);
return View(genericVehicle);
}
编辑:这么说,我真的认为你应该把它们放在两个不同的动作方法中。这使您的代码更干净,可读性更好。如果需要操作方法id,您可以将通用功能移动到函数并调用。所以我会这样做
假设您有第一页的ViewModel,则显示所有车辆类型
public class VehicleTypesViewModel
{
//other relevant properties
public IEnumerable Types { set;get;}
public int SelectedTypeId { set;get;}
}
此操作结果将处理您获取初始视图的请求。它获取所有车辆类型,并将其返回到ViewModels types属性中的视图
public ActionResult VehicleTypes()
{
VehicleTypesViewModel objVM=new VehicleTypesViewModel();
objVM.Types=dbContext.VehicleTypes.ToList();
return View(objVM);
}
在您的视图中称为VehicleTypes.cshtml
@model VehicleTypesViewModel
@using(Html.BeginForm())
{
@Html.DropDownListFor(Model.SelectedTypeId,new SelectList(Model.Types,"Text",Value"),"Select")
<input type="submit" value="Go" />
}
或者,您可以使用重定向操作方法对特定车辆执行Get请求。我更喜欢这种方法,因为它坚持PRG模式
[HttpPost]
public ActionResult VehicleTypes(VehicleTypesViewModel model)
{
int typeId=model.SelectedTypeId;
return RedirectToAction("GetVehicle",new {@id=typeId});
}
public ActionResult GetVehicle(int id)
{
var specificVehicle=dbContext.Vehicles.Where(x=>x.TypeIdid);
return View(specificVehicle);
}
使用Javascript:您还可以从Javascript调用新视图。没有HTTPpost到控制器。为此,您应该在初始视图中添加一些javascript
@model VehicleTypesViewModel
//Include jQuery library reference here
@Html.DropDownListFor(Model.SelectedTypeId,new SelectList(Model.Types,"Text",Value"),"Select")
<script type="text/javascript">
$(function(){
$("#SelectedTypeId").change(){
window.location.href="@Url.Action("GetVehicle","Yourcontroller")"+"/"+$(this).attr("id");
});
});
</script>
我认为为了获得更好的用户体验,可以创建一个部分视图,并通过ajax调用将该部分视图加载到同一页面的div中
public ActionResult GetVehicalInfo(string id, string vehicleType)
{
var vehicle = GetVehicleType(id, vehicleTypId);
return PartialView("vehicle);
}
是否要在整个页面中显示新视图?还是一页的一部分?或者是一个模型对话框?我认为不显示页面刷新会很好-但也许一个新的页面有意义,不确定,肯定不是一个对话框。但我需要将从车辆页面创建的id转存,因为这将在下一页用作外键。我添加了一个asnwer。你能给我们看看你的模型吗?我想你应该把它放在两个单独的动作方法中。这使您的代码更干净,可读性更好。
public ActionResult GetVehicalInfo(string id, string vehicleType)
{
var vehicle = GetVehicleType(id, vehicleTypId);
return PartialView("vehicle);
}