尝试使用MVC3 + Razor让我的鸭子连续出现!
我终于理解了“视图模型”的概念来包装我的实体类并将它们定制到View。
现在我正在组装一个页面,其中部分视图表示页面所需的不同元素(例如下拉列表,表单等),每个元素都将由“视图 - 表示 - 模型'映射到实体类并返回到我的数据库。
首先,我尝试创建一个表示组件的局部视图,该组件是数据库中元素的下拉列表,选中后将呈现另一个局部视图等。
我不能把为什么我不能生成这个下拉列表放在一起,一旦我做了主'控制器'如何将这一切映射到一起?
简而言之,我很好奇 - 每个局部视图是否需要一个控制器,即使它是基于一个强类型模型?
打破它:
我的实体模型 - 查看包装器(获取数据库中的所有元素
* 已更新 * - 现在转到一个工作示例,请注意我之前没想到正确的问题,但是这个会让你知道我想要完成的事情!下一步是将所有这些操作“关闭”控制器(并在模型默认构造函数中填充它们,以便以后使用)。
CharactersListViewModel.cs
Going to move avoid the 'View Model' for now until I get a little more comfortable
创建一个部分视图,显示一个下拉列表,其中字符的ID为值,名称为文本,创建强类型视图,部分视图
部分主页的控制器:
HistoryController.cs
public class HistoryController : Controller
{
public ActionResult Index()
{
var list = new List<SelectListItem>();
using (var _database = new fff_newEntities())
{
foreach(Character c in (from c in _database.Characters select c)){
list.Add(new SelectListItem(){Text = c.CharacterName, Value = c.Id.ToString()});
}
}
ViewBag.Clients = list;
}
}
//
// GET: /History/Details/5
public ActionResult Details(int id)
{
return View();
}
//
// GET: /History/Create
public ActionResult Create()
{
return View();
}
//
// POST: /History/Create
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
//
// GET: /History/Edit/5
public ActionResult Edit(int id)
{
return View();
}
//
// POST: /History/Edit/5
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Delete(int id)
{
return View();
}
//
// POST: /History/Delete/5
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
// TODO: Add delete logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
显示整个页面的索引,包括部分组件(我的下拉列表)
index.cshtml :
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@Html.DropDownListFor(x => x.CurrentCharacterId, (IEnumerable<SelectListItem>)ViewBag.Clients);
在最后一行, @ Html.Action(...) 我在哪里实际创建下拉列表?
很抱歉,如果这看起来微不足道,但我无法理解它,我真的想要正确学习MVC3 + Razor!
答案 0 :(得分:2)
部分视图旨在抽象出一些HTML / View Logic,以便可以在多个地方重复使用或重复(循环)。
虽然你可以有一个映射到局部的动作,如果有问题的部分可以进行一些显式的数据访问,这可能是要走的路,但是如果你只需要从控制器本身传递所需的所有数据那么 - 不,你不需要控制器/动作。
由于你正在做一些明确的数据访问,我可能会为它做一个动作......
[ChildActionOnly]
public ActionResult Characters()
{
using (var _database = new entities())
{
CharactersViewModel viewModel = new CharactersViewModel();
viewModel.Characters = _database.Characters.ToDictionary(c => c.Id, c => c.CharacterName);
return PartialView(viewModel);
}
}
在你看来......
@Html.Action("Characters")
当然,你做这件事的方式并没有什么不妥,但是如果你想通过ajax请求从这个渲染的局部视图中检索HTML,我发现将它映射到一个动作可以让事情变得更容易。某种东西。
备注: