我正在尝试创建索引页面的组合视图(使用IEnumerable
生成产品列表)和创建页面(具有添加/保存内容)
我得到lambda表达式的错误。
这是我的代码:
@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>
}
我该怎么办? 编辑: 这是我的控制器
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 :(得分:5)
要制作组合视图,您必须执行以下操作。
创建具有2个属性的ViewModel
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>
}
控制器和索引操作
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);
}
}
答案 1 :(得分:2)
您需要创建另一个ViewModel以满足显示List和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" })
在同一行中,您需要重构View页面。
在您的控制器中,您当前必须传递一个列表。您需要更改它以传递新的CategoryViewModel
List<Category> categories = "your db call";
CategoryViewModel viewModel = new CategoryViewModel();
viewModel.Categories = categories;
viewModel.Category = new Category();
return View(viewModel);
答案 2 :(得分:0)
您的问题出在<thead>
。您尝试从类别模型访问属性:
@Html.DisplayNameFor(model => model.category_name)
但您的模型是IEnumerable,没有属性category_name
。