Razor中的部分ViewModels,控制器

时间:2011-04-23 18:09:22

标签: asp.net-mvc-3 entity-framework razor viewmodel

尝试使用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!

1 个答案:

答案 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,我发现将它映射到一个动作可以让事情变得更容易。某种东西。

备注

  • 尝试将实体上下文对象包装在一个使用中,以便它可以处理连接。
  • 您可以使用ToDictionary直接从查询范围中选择字典。