C# Asp.Net MVC-Viewmodel空值
我制作了一个webapp,您可以通过客户端id进行搜索,然后在该客户端上添加订单。索引操作方法将所选客户端分配给viewmodel(vm.AllClients)。订单表当然有关于客户机的信息。在Insert方法中,我想使用关于所选客户机的信息,但现在vm.AllClients返回null 在调试vm.AllClients的过程中,在运行第一个方法的过程中,应该使用一个client对象填充它。当第二个方法运行vm.AllClients时为空 我尝试将搜索字符串保存为变量,并在db中找到它(这不是一个好的解决方案),但在运行第二个方法时,该变量也是空的。还尝试将所选客户端保存为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中找到它(这不是一
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教程。为了更好地了解每件事是如何运作的。
但现在来回答您的问题:
在您的示例中有几个问题:
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))