元组模型导致NULL POST参数



在这里,索引获取我的控制器的方法:

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
}

最新更新