我是Asp.net Mvc3的新手。我不能这样做:如何使用Test方法显示列表但我不能写@ product.Test()。 我是新人,你能帮帮我吗? VIEW:
@model IList<MvcApplicationScottGu.Models.ProductModel>
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "Product";
}
<h2>Product</h2>
<ul>
@foreach (var product in Model)
<li>@product.Test()</li>
</ul>
控制器:
namespace MvcApplicationScottGu.Controllers
{
public class ProductController : Controller
{
//
// GET: /Product/
public ActionResult Test()
{
var products = new ProductModel().GetProduct();
return View("Product",products);
}
}
}
答案 0 :(得分:10)
问题是您正在尝试从视图中调用操作。这意味着你真的没有得到MVC。这意味着您正在尝试使用MVC视图,就好像它是Web窗体一样。
MVC中的视图只是模板,用于填充用户可以轻松消化的格式良好的数据。
让我们使用季节性类比。
MVC请求的故事:
在MVC中,view
就像你的圣诞火鸡。火鸡充满了数据,并提供给用户。
Controller
就像厨师一样。这家人向他要了一只火鸡,然后他做饭并为圣诞晚餐供应。要煮火鸡,厨师必须先从商店取出。厨师购买火鸡的商店是Model
。
整个过程是有道理的。
ASP.NET Web窗体请求的故事:
在ASP.NET Web窗体中,情况有所不同。
再一次,这个家庭希望土耳其吃他们的圣诞晚餐。他们没有使用厨师,而是做了一些非常不可能的事情:
家人问起火鸡,而不是问厨师。
火鸡说“OK”(或者更确切地说,“Gobble,goggle,gobble”)。然后杀死自己,自己采摘,自己做饭,如果它没有在微波炉中爆炸,就会向家庭(用户)提供燔祭。
它没有被大量可爱的熟食数据所包裹,而是充满了一种名为ViewState的无法消化的难以消化的粘性物,这有点像宇航员的圣诞晚餐。
晚餐非常恶心,欢乐的欢乐聚会变成了混乱,有人向圣诞老人放火,圣诞老人仍然被烟囱堵住(他吃了太多肉馅饼)。
与此同时,鲁道夫已经退回拉普兰,以便能够及时恢复到车辙季节,这有点像他的圣诞节。祝大家圣诞快乐(或者至少是那些圣诞节的人)。
答案 1 :(得分:3)
您无需在视图中调用Test()
方法。
视图中的Model
属性是您在此处传递的第二个参数:
return View("Product", products);
因此,基本上,控制器级别的products
变量在您的视图中变为Model
。
在实际呈现View时,已调用ProductController.Test()
方法(事实上,此调用是使View甚至渲染的原因)。
答案 2 :(得分:1)
您已将Product模型传递给视图,因此您无需在视图中调用控制器操作。只需使用
@ product.PropertyNameHere
智能感知,如果你启用它,应该在输入@product时自动填充选项列表。
你也想确保你围绕着你的foreach,虽然我不完全确定它是必要的......我认为是。
@foreach (var product in Model)
{
<li>@product.Whatever</li>
}
答案 3 :(得分:1)
我将使用Entity Framework 4.1代码优先方法向您展示如何执行此操作。首先是模型
namespace MvcApp.Models
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}
}
现在是上下文。
using System.Data.Entity;
namespace MvcApp.Models
{
public class MyAppContext : DBContext
{
public DBSet<Product> { get; set; }
}
}
现在初始化数据库
namespace MvcApp.Models
{
public class MyAppContextInitializer : DropAndCreateAlways<MyAppContext>
{
protected override void Seed(MyAppContext context)
{
Product product = new Product
{
Name = "Widget",
Price = 10.00m;
Description = "It's a widget!"
};
context.Products.Add(product);
base.seed(context);
}
}
}
现在将以下行添加到Global.asax.cs的Application_Start()方法。
Database.SetInitializer(new MvcAppContextIntializer());
您现在拥有一个包含一条数据记录的数据库。回到MVC。首先是控制器和动作方法。您应该首先创建控制器和操作方法,而不是相反。
namespace MvcApp.Controllers
{
public class ProductController : Controller
{
DBContext dbContext = new DBContext();
//
// GET: /Product/
public ViewResult List()
{
IEnumerable<Product> products = dbContext.Products;
return View(products);
}
}
}
现在右键单击List操作方法,然后选择Add View。确保将视图命名为“Test”或类似更具描述性的“List”。不要使用脚手架模板。选中“创建强类型视图”并在“模型类:”字段中键入IEnumerable。视图文件List.cshtml将放在Views \ Product文件夹中。添加以下标记和剃刀代码。
@model IEnumerable<MvcApp.Models.Product>
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "List of Products";
}
<h2>Product List</h2>
<ul>
@foreach (var p in Model)
{
<li>@p.Name></li>
<li>@p.Description</li>
<li>@p.Price</li>
}
</ul>
假设您有一个带有索引操作方法的HomeController,应用程序将启动。将产品/列表添加到站点URL并按Enter键。你的观点应该加载。我希望这会有所帮助。
答案 4 :(得分:0)
尝试时会发生什么?我们可以看到您的Test()
方法吗?
您是否尝试使用这样的括号括起列表项生成?
<ul>
@foreach (var product in Model)
{
<li>@product.Test()</li>
}
</ul>