2015-04-19 5 views
0

Я пытаюсь создать комбинированный вид страницы с индексом (который имеет список продуктов с использованием IEnumerable) и с помощью Create Page (который имеет добавление/сохранение материала) , и я получаю ошибки с лямбда-выражениями.Проблемы с комбинированным представлением и IEnumerable моделью в asp.Net MVC

Вот мой код:

@model IEnumerable<OIS.Models.Category> 

<table class="table"> 
<thead> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.category_name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.date_created) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.date_updated) 
     </th> 
     <th></th> 
    </tr> 
</thead> 
<tbody> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.category_name) 

      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.date_created) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.date_updated) 
      </td> 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | 
       @Html.ActionLink("Details", "Details", new { id = item.ID }) | 
       @Html.ActionLink("Delete", "Delete", new { id = item.ID }) 
      </td> 
     </tr> 
    } 
</tbody> 
</table> 

//For for Creating new Item 
@using (Html.BeginForm()){ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>Category</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     //Im Gettig Error with this line (model => model.category_name) 
     @Html.LabelFor(model => model.category_name, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      //Im Gettig Error with this line (model => model.category_name) 
      @Html.EditorFor(model => model.category_name, new { htmlAttributes = new { @class = "form-control" } }) 
      //Im Gettig Error with this line (model => model.category_name) 
      @Html.ValidationMessageFor(model => model.category_name, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 
}  

Что мне делать? Edited: Вот мой контроллер

namespace OIS.Controllers{ 
public class CategoryController : Controller 
{ 
    private DbOnlineIS db = new DbOnlineIS(); 

    // GET: Category 
    public ActionResult Index() 
    { 
     return View(db.Categories.ToList()); 
    } 

    // Post: Category 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Index([Bind(Include = "ID,category_name,date_created,date_updated")] Category category) 
    { 
     if (ModelState.IsValid) 
     { 
      category.date_created = DateTime.Now; 
      category.date_updated = DateTime.Now; 
      db.Categories.Add(category); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(category); 
    } 
    // GET: Category/Create 

    public ActionResult Create() 
    { 
     return View(); 
    } 

    // POST: Category/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "ID,category_name,date_created,date_updated")] Category category) 
    { 
     if (ModelState.IsValid) 
     { 
      category.date_created = DateTime.Now; 
      category.date_updated = DateTime.Now; 
      db.Categories.Add(category); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(category); 
    } 
+0

Что такое ошибка ocorruing? –

+0

Вам нужно создать ViewModel –

+0

Ошибка говорит «не содержит определения для category_name» – jessemiel

ответ

4

Чтобы сделать общий вид , вам нужно сделать что-то вроде ниже.

Создать ViewModel, которые имеют 2 свойства

public class CategoryViewModel { 
    public IEnumerable<OIS.Models.Category> Categories { get; set; } 
    public Category Category { get; set; } 
} 

После этого вы двигаетесь, Создание и список, из представления в 2 частичным видом. Скажем, _CategoryCreatePartial.cshtml и _CategoryListPartial.cshtml.

Чем комбинированный вид стать чем-то вроде этого, Index.cshtml

@model OIS.Models.CategoryViewModel 

@Html.Partial("_CategoryListPartial", Model.Categories) 

@Html.Partial("_CategoryCreatePartial", Model.Category) 

Частичные Просмотров:

_CategoryListPartial.cshtml

@model IEnumerable<OIS.Models.Category> 

<table class="table"> 
<thead> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.category_name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.date_created) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.date_updated) 
     </th> 
     <th></th> 
    </tr> 
</thead> 
<tbody> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.category_name) 

      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.date_created) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.date_updated) 
      </td> 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | 
       @Html.ActionLink("Details", "Details", new { id = item.ID }) | 
       @Html.ActionLink("Delete", "Delete", new { id = item.ID }) 
      </td> 
     </tr> 
    } 
</tbody> 
</table> 

_CategoryCreatePartial.cshtml

@model OIS.Models.Category 

@using (Html.BeginForm("Create", "Category")){ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Category</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      //Im Gettig Error with this line (model => model.category_name) 
      @Html.LabelFor(model => model.category_name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       //Im Gettig Error with this line (model => model.category_name) 
       @Html.EditorFor(model => model.category_name, new { htmlAttributes = new { @class = "form-control" } }) 
       //Im Gettig Error with this line (model => model.category_name) 
       @Html.ValidationMessageFor(model => model.category_name, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
}  

контроллер и действие Index

public class CategoryController : Controller 
{ 
    private DbOnlineIS db = new DbOnlineIS(); 

    public ActionResult Index() { 
     var categoryViewModel = new CategoryViewModel(); 
     categoryViewModel.Categories = db.Categories.ToList(); 
     categoryViewModel.Category = new Category(); 
     return View(categoryViewModel); // list + create category 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Category category) // call this action to create category. 
    { 
     if (ModelState.IsValid) 
     { 
      category.date_created = DateTime.Now; 
      category.date_updated = DateTime.Now; 
      db.Categories.Add(category); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(category); 
    } 
} 
+0

Эй! Я пробовал ваш ответ, кажется замечательным, но у меня есть некоторые ошибки в этой части. '@ Html.Partial (« _ListListPartial », CategoryViewModel.Categories)' '@ Html.Partial (« _Составление категорий », CategoryViewModel. Категория) 'ошибка говорит:« Имя CategoryViewModel не существует в текущем контексте » – jessemiel

+0

Я получил его! Я только что изменил '@ Html.Partial (" _ CategoryListPartial ", CategoryViewModel.Categories)' в '@ Html.Partial (" _ CategoryListPartial ", Model.Categories)' Большое спасибо за вашу помощь !! – jessemiel

0

Ваша проблема заключается в <thead>. Вы пытаетесь получить доступ к свойствам из категории Модели:

@Html.DisplayNameFor(model => model.category_name) 

Но ваша модель является IEnumerable и не имеет свойства category_name.

1

Вам нужно будет создать еще один ViewModel, чтобы удовлетворить это требование показа списка, а также на экране Create.

public class CategoryViewModel 
{ 
    public List<OIS.Models.Category> Categories {get;set;} 
    public OIS.Models.Category Category {get;set;} 
} 

С вашей точки зрения бритвы установите модель новой ViewModel

@model CategoryViewModel 

В вашем перечислении теперь получить доступ к списку внутри этой новой ViewModel

@foreach (var item in Model.Categories) 

Чтобы создать доступ раздел категория из ViewModel

@Html.LabelFor(model => model.Category.category_name, htmlAttributes: new { @class = "control-label col-md-2" })  

На тех же строках вам нужно будет реорганизовать страницу просмотра.

В вашем контроллере вы должны в настоящее время передавать список. Вам нужно будет изменить это, чтобы передать новый код CategoryViewModel

List<Category> categories = "your db call"; 
CategoryViewModel viewModel = new CategoryViewModel(); 
viewModel.Categories = categories; 
viewModel.Category = new Category(); 
return View(viewModel); 
+0

HI! Я попробовал ваши предложения, и это здорово. но теперь я получаю это сообщение об ошибке. Элемент модели, переданный в словарь, имеет тип «System.Collections.Generic.List'1 [OIS.Models.Category]», но для этого словаря требуется элемент модели типа «OIS .Models.CategoryViewModel. ... Это значит? – jessemiel

+0

@jesse В вашем коде контроллера вы в настоящее время передаете список категорий. Вам нужно изменить это и передать CategoryViewModel. Обновленный ответ, чтобы отразить это. –

+0

Мне так жаль, что я действительно здесь noob. Что мне следует включить в раздел «ваш db call»? – jessemiel

Смежные вопросы