Как заполнить список с помощью бритвы Mvc 3? - PullRequest
1 голос
/ 21 декабря 2011

Я новый в Asp.net Mvc3.я не могу этого сделать: как я могу показать список, используя метод Test, но я не могу написать @ product.Test ().Я новичок, вы можете мне помочь?
ПРОСМОТР:


@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 ]

10 голосов
/ 21 декабря 2011

Если вы сражаетесь с MVC, MVC не победит, но вы проиграете

Проблема в том, что вы пытаетесь вызвать действие из представления. Что означает, что вы серьезно не получаете MVC. Это означает, что вы пытаетесь использовать представление MVC, как если бы это была веб-форма.

Представления в MVC - это просто шаблоны для заполнения полноформатных данных, которые пользователь может легко переварить.

MVC против веб-форм - Повесть о двух рождественских запросах

Позволяет использовать сезонную аналогию.

Сказка о запросе MVC:

В MVC view похоже на вашу рождественскую индейку. Индейка наполняется данными и подается пользователю.

Controller похож на повара. Семья просит у него индейку, и он готовит ее и подает на рождественский ужин. Чтобы приготовить индейку, повар должен сначала получить ее из магазина. Магазин, где повар покупает индейку, - Model.

Весь процесс имеет смысл.

Сказ о запросе веб-форм ASP.NET:

В ASP.NET Web Forms ситуация другая.

Опять семья хочет Турцию на рождественский ужин. Вместо того чтобы готовить, они делают что-то невероятное:

Вместо того, чтобы спрашивать повара, семья спрашивает индейку.

Индейка говорит "ОК" (или, скорее, "Gobble, goggle, gobble"). Затем он убивает себя, срывает с себя, готовит сам, и, если он не взорвался в микроволновой печи, всесожжение подается семье (пользователю).

Вместо того, чтобы наполняться множеством прекрасных, хорошо приготовленных данных, он наполняется непривлекательной и неусвояемой липкостью под названием ViewState, которая напоминает рождественский ужин астронавта.

Обед настолько отвратителен, что веселое праздничное собрание превращается в хаос, и кто-то поджигает Деда Мороза, который все еще застрял в дымоходе (он съел слишком много пирогов).

Рудольф, тем временем, отправился обратно в Лапландию, чтобы успеть восстановиться к сезону гона, который напоминает его Рождество.

С Рождеством всех (или, по крайней мере, тех из вас, кто в Рождество).

3 голосов
/ 21 декабря 2011

Вам не нужно вызывать этот Test() метод в представлении.

Ваше свойство Model в представлении - это то, что вы передаете в качестве второго параметра здесь:

return View("Product", products);

Таким образом, в принципе, products переменная на уровне контроллера становится Model на ваш взгляд. Ко времени фактического рендеринга View метод ProductController.Test() уже вызывается (фактически этот вызов делает рендеринг View ровным).

1 голос
/ 23 декабря 2011

Я покажу вам, как это сделать, используя метод кода 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);
        }

    }
}

Теперь добавьте следующую строку в метод Application_Start () файла Global.asax.cs.

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. Обязательно назовите представление «Тест» или что-то вроде более описательного «Список» Не используйте шаблон строительных лесов. Установите флажок «Создать строго типизированное представление» и введите 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 с методом действия Index, приложение запустится. Добавьте продукт / список к URL-адресу сайта и нажмите Enter. Ваше мнение должно загрузить. Надеюсь, это поможет.

1 голос
/ 21 декабря 2011

Вы передали модель Product в представление, поэтому вам не нужно вызывать действие контроллера внутри представления. Просто используйте

@product.PropertyNameHere

Intellisense, если он включен, должен автоматически заполнять список параметров, как только вы наберете @product. .

Вы также захотите удостовериться, что вы держите в скобках вокруг своего foreach, хотя я не совсем уверен, что это необходимо ... Я думаю, что это так.

@foreach (var product in Model)
{
<li>@product.Whatever</li>
}
0 голосов
/ 21 декабря 2011

Что именно происходит при попытке? Можем ли мы увидеть ваш Test() метод?

Вы пробовали заключать в скобки генерацию элементов списка, как это?

<ul>
@foreach (var product in Model)
{
  <li>@product.Test()</li>
}
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...