C# Asp.Net MVC-Viewmodel空值

C# Asp.Net MVC-Viewmodel空值,c#,asp.net-mvc,mvvm,C#,Asp.net Mvc,Mvvm,我制作了一个webapp,您可以通过客户端id进行搜索,然后在该客户端上添加订单。索引操作方法将所选客户端分配给viewmodel(vm.AllClients)。订单表当然有关于客户机的信息。在Insert方法中,我想使用关于所选客户机的信息,但现在vm.AllClients返回null 在调试vm.AllClients的过程中,在运行第一个方法的过程中,应该使用一个client对象填充它。当第二个方法运行vm.AllClients时为空 我尝试将搜索字符串保存为变量,并在db中找到它(这不是一

我制作了一个webapp,您可以通过客户端id进行搜索,然后在该客户端上添加订单。索引操作方法将所选客户端分配给viewmodel(vm.AllClients)。订单表当然有关于客户机的信息。在Insert方法中,我想使用关于所选客户机的信息,但现在vm.AllClients返回null

在调试vm.AllClients的过程中,在运行第一个方法的过程中,应该使用一个client对象填充它。当第二个方法运行vm.AllClients时为空

我尝试将搜索字符串保存为变量,并在db中找到它(这不是一个好的解决方案),但在运行第二个方法时,该变量也是空的。还尝试将所选客户端保存为viewmodel中的客户端对象,但仍然没有骰子

添加控制器

using MainWeb.Models;

public class AddController : Controller
    {
        OrderEntities db = new OrderEntities();// New instance of db.
        ViewModel vm = new ViewModel();//New instance of viewmodel


[HttpPost]
        public ActionResult Index(string searchTerm)
        {
            if (string.IsNullOrEmpty(searchTerm))
            {
                vm.AllClients = new List<Client>();
            }
            else
            {
                vm.AllClients = db.Clients.Where(x => 
                x.RefNo.ToString().Equals(searchTerm)).ToList();

                foreach (Client client in vm.AllClients)
                {
                    vm.ThisClient = client;//Attempt at a different solution
                    break;
                }

            }
                return View(vm);
        }


public ActionResult InsertOrder(FormCollection form)
        {
            Order order = new Order();

            order.ClientID = vm.AllClients[0].ID;//Here is where the error gets thrown
            return RedirectToAction("Index");
        }

每个请求都会获得一个新的控制器实例,因此不能使用全局Viewmodel变量。如果要在控制器操作之间进行通信,请使用
ViewData
对象,或者只需将数据发送到客户端,然后通过
FormCollection
ViewModel
类获取数据。

通常情况下,您正在尝试编写一个新的asp.net web应用程序<强>但您应该考虑使用ASP.NET核心< /强>。此框架是asp.net mvc的后续版本,您不应该开始编写asp.net核心mvc而不是整个框架。 已弃用,将被asp.net核心mvc取代

我想你应该先做微软的mvc教程。为了更好地了解每件事是如何运作的。

但现在来回答您的问题: 在您的示例中有几个问题:

  • ViewModel不应该是中心类。在控制器操作中创建它,因为每个webrequest get都是控制器的新实例
  • 当您点击“InsertOrder”时,将为新请求新建控制器。这意味着您将获得控制器的新实例,并且您的viewModel再次为空
  • 您的cshtml永远不会命中“插入顺序”
  • InsertOrder可以将formcollection直接映射到类中
  • 小调:不应使用表格布局html-请参阅:
  • 您的控制器应该如下所示

    public class AddController : Controller
        {
            OrderEntities db = new OrderEntities();// New instance of db.
    
    
    
    [HttpPost]
            public ActionResult Index(string searchTerm)
            {
                var vm = new ViewModel();
                if (string.IsNullOrEmpty(searchTerm))
                {
                    vm.AllClients = new List<Client>();
                }
                else
                {
                    vm.AllClients = db.Clients.Where(x => 
                    x.RefNo.ToString().Equals(searchTerm)).ToList();
    
                    foreach (Client client in vm.AllClients)
                    {
                        vm.ThisClient = client;//Attempt at a different solution
                        break;
                    }
    
                }
                    return View(vm);
            }
    
    [HttpPost]
    public ActionResult InsertOrder(ViewModel vm)
            {
                Order order = new Order();
    
                order.ClientID = vm.AllClients[0].ID;//Here is where the error gets thrown
                return RedirectToAction("Index");
            }
    

    请提供一个简单的示例,您的业务逻辑中存在大量代码,问题中不必要。您希望我编辑它,还是删除它并发表新文章?如果可能,只需编辑问题并删除不必要的代码,谢谢。@Matějětágl这更好吗?那么您所做的唯一区别就是使用ViewModel作为参数?我想是的。但是您应该看看@CSP的整个生命周期,可能会更熟悉一般的web mvc技术;)我用TempData让它工作了,不过可能是坏习惯。这是我的第一个MVC网络应用,尝试学习,谢谢:)祝你好运-我链接的教程非常好。您应该使用asp.net核心(与平台无关、依赖注入等)他更多的是在部门,但它与TempData一起工作,非常接近ViewData,所以不知道该给谁。感谢你们两位抽出时间!:)
    namespace MainWeb.Models
    {
        public class ViewModel
        {
            public List<Client> AllClients { get; set; } 
            public Client ThisClient { get; set; }
    
        }
    }
    
    Object reference not set to an instance of an object
    
    public class AddController : Controller
        {
            OrderEntities db = new OrderEntities();// New instance of db.
    
    
    
    [HttpPost]
            public ActionResult Index(string searchTerm)
            {
                var vm = new ViewModel();
                if (string.IsNullOrEmpty(searchTerm))
                {
                    vm.AllClients = new List<Client>();
                }
                else
                {
                    vm.AllClients = db.Clients.Where(x => 
                    x.RefNo.ToString().Equals(searchTerm)).ToList();
    
                    foreach (Client client in vm.AllClients)
                    {
                        vm.ThisClient = client;//Attempt at a different solution
                        break;
                    }
    
                }
                    return View(vm);
            }
    
    [HttpPost]
    public ActionResult InsertOrder(ViewModel vm)
            {
                Order order = new Order();
    
                order.ClientID = vm.AllClients[0].ID;//Here is where the error gets thrown
                return RedirectToAction("Index");
            }
    
     @using (Html.BeginForm("InsertOrder", "Add", FormMethod.Post))