在 .NET 和 C#(我来自Java和Spring框架)中,我是一个新手,在学习本教程时遇到了一些问题。
我有一个简单的 controller 类:
namespace Vidly.Controllers
{
public class CustomersController : Controller
{
public ViewResult Index()
{
var customers = GetCustomers();
return View(customers);
}
public ActionResult Details(int id)
{
System.Diagnostics.Debug.WriteLine("Into Details()");
var customer = GetCustomers().SingleOrDefault(c => c.Id == id);
System.Diagnostics.Debug.WriteLine("customer: " + customer.Id + " " + customer.Name);
if (customer == null)
return HttpNotFound();
return View(customer);
}
private IEnumerable<Customer> GetCustomers()
{
return new List<Customer>
{
new Customer { Id = 1, Name = "John Smith" },
new Customer { Id = 2, Name = "Mary Williams" }
};
}
}
}
您可以看到该类包含以下 Details(int id)方法:
public ActionResult Details(int id)
{
System.Diagnostics.Debug.WriteLine("Into Details()");
var customer = GetCustomers().SingleOrDefault(c => c.Id == id);
System.Diagnostics.Debug.WriteLine("customer: " + customer.Id + " " + customer.Name);
if (customer == null)
return HttpNotFound();
return View(customer);
}
因此,此方法可以处理针对URL的 GET 类型的 HTTP 请求,例如
localhost:62144/Customers/Details/1
似乎可行,因为进入输出控制台后,我获得了 Into Details()日志。另一个日志还说明客户模型对象已正确初始化,实际上我获得了以下控制台输出:
customer: 1 John Smith
然后,控制器重新调用包含先前模型对象的 ViewResult 对象(调用 View 方法)。
我认为.NET会自动尝试将此 ViewResult 对象(包含模型)发送到与处理该请求的控制器方法名称相同的视图。所以我有这个 Details.cshtml 视图:
@model Vidly.Models.Customer
@{
ViewBag.Title = Model.Name;
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@Model.Name</h2>
理论上应该接收此 ViewResult 对象,然后从此处提取模型对象(具有 Vidly.Models.Customer 作为类型),并应打印此模型对象的名称属性。
问题是我正在获得此例外,而不是包含预期数据的预期页面:
[InvalidOperationException: The model item passed into the dictionary is of type 'Vidly.Models.Customer', but this dictionary requires a model item of type 'Vidly.ViewModels.RandomMovieViewModel'.]
为什么?是什么意思?
Vidly.ViewModels.RandomMovieViewModel是另一个控制器和另一个视图中使用的另一个模型对象。
出什么问题了?我想念什么?我该如何解决这个问题?
答案 0 :(得分:1)
出现此错误是由于_Layout.cshtml
文件中的 Vidly.ViewModels.RandomMovieViewModel 模型声明。
在布局视图中声明模型意味着所有使用布局视图的视图必须使用该模型类或从该布局视图模型类派生的类