在这里,索引获取我的控制器的方法:
public async Task<ActionResult> Index()
{
var models = new Tuple<List<Order>, List<Operator>>(await _context.Orders.AsNoTracking().Where(x => x.State == orderState).ToListAsync(), _liveData.Operators);
return View(models);
}
在相关的视图中,我显示所有行,它们有一个下拉列表:
@model Tuple<List<Order>, List<Operators>>
@using (Html.BeginForm("Index", "Orders", FormMethod.Post, new { @id = "form1" }))
{
@for (var i = 0; i < Model.Item1.Count; i++)
{
@Html.HiddenFor(modelItem => Model.Item1[i].Id)
@Html.DisplayFor(modelItem => Model.Item1[i].Number)
@Html.DisplayFor(modelItem => Model.Item1[i].Quantity)
<select class="custom-select" required>
<option value="None" selected>Select one</option>
@foreach (var op in Model.Item2)
{
<option value="@op.Name">@op.Name</option>
}
</select>
}
}
在这里我不工作的帖子处理程序:
[HttpPost]
public async Task<ActionResult> Index(List<Order> orders, List<Operator> op)
{
// both orders and op are null
}
我期望我传递给视图的同一模型,但它们都是无效的。
元组语法中是否有错误?
编辑
如果这可能会改变某些内容,我在这里添加了在控制器中定义订单和操作员的方式:
public class OrdersController : Controller
{
public MyContext _context { get; set; }
public LiveData _liveData { get; set; }
public OrdersController(MyContext context, LiveData liveData)
{
_context = context;
_liveData = liveData;
}
}
in dal:
public class MyContext : DbContext
{
public IConnectionManager ConnectionManager { get; set; }
public MyContext() : base("MyContext") { }
public DbSet<Order> Orders { get; set; }
}
public class LiveData : IDisposable
{
public MyContext _context { get; set; }
public LiveData(MyContext context)
{
_context = context;
Operators = new List<Operator>();
}
public List<Operator> Operators { get; set; }
}
最后,我使用autoFac注入它们:
public class AutofacContainer
{
public IContainer Container { get; set; }
public AutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<MyContext>().PropertiesAutowired();
builder.RegisterType<LiveData>().PropertiesAutowired().InstancePerLifetimeScope();
Container = builder.Build();
GlobalConfiguration.Configuration.UseAutofacActivator(Container);
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(Container));
}
}
您的视图强烈输入到 Tuple<List<T>,List<U>>
时,在您的操作方法中,您指定了两个参数是List<T>
和List<U>
,for Post将束缚在实际模型中,因此您应该更改您的具有与输入参数相同类型的操作方法,您的视图强烈键入喜欢:
[HttpPost]
public async Task<ActionResult> Index(Tuple<List<Order>,List<Operator>> model)
{
// do something here using model
}
但是上面的仍然不起作用,因为Tuple
不包含无参数构造函数,因此框架将无法在METHID后绑定模型。
您可以通过创建 viewModel 来实现这一目标
public class OrderOperatorViewModel
{
public List<Order> Orders {get;set;}
public List<Operator> Operators {get;set;}
}
然后在行动中填充它并返回:
public async Task<ActionResult> Index()
{
var models = new OrderOperatorViewModel();
// fetch data and set properties here
return View(models);
}
然后在视图中使用它:
@model OrderOperatorViewModel
现在正在行动:
[HttpPost]
public async Task<ActionResult> Index(OrderOperatorViewModel model)
{
// todo here
}