如何使用Mvc 3剃须刀填写清单?

时间:2011-12-20 20:38:39

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我是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);
        }

    }
}

5 个答案:

答案 0 :(得分:10)

如果你对抗MVC,MVC将无法获胜,但你将失去

问题是您正在尝试从视图中调用操作。这意味着你真的没有得到MVC。这意味着您正在尝试使用MVC视图,就好像它是Web窗体一样。

MVC中的视图只是模板,用于填充用户可以轻松消化的格式良好的数据。

MVC与Web表单 - 两个圣诞请求的故事

让我们使用季节性类比。

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>
相关问题