在哪里以及如何加载母版页中使用的下拉列表

时间:2010-07-28 13:54:28

标签: asp.net-mvc-2

我是MVC的新手!

我正在尝试在将在MasterPage中使用的PartialView中使用两个DropDownLists(Cities,Categories),这意味着它们将始终是可见的。

我试图在HomeCOntroller中加载它们,但那不起作用。我有一个例外。

我读了一些关于创建其他控制器将继承的baseController的东西,我已经尝试过了,有点,但我想我做错了。

这是我今天唯一获得的代码:

母版

<% Html.RenderPartial("SearchForm"); %>

PartialView(SearchForm.ascx)

<% using (Html.BeginForm("Search", "Search")) { %>
<% } %> // dont know why I need two BeginForms, if I dont have this the other form won't trigger at all! Weird!

<% using (Html.BeginForm("Search", "Search", FormMethod.Get)) { %>

    <%= Html.DropDownList("SearchForm.Category",  new SelectList(ViewData["Categories"] as IEnumerable, "ID", "Name", "--All categories--")) %>

    <%= Html.DropDownList("Search.City", Model.Cities, "--All cities--") %>
    <input name="search" type="text" size="16" id="search" />
    <input type="submit" id="test" title="Search" />
    <% } %>

两个问题:

  1. 在哪里以及如何加载DropDownLists是问题所在。我试图在HomeController中加载它,但是当转到另一个页面时它会说DDL是空的并且我得到了一个Excecption。
  2. 为什么我必须使用两个表单来触发ActionMethod?
  3. 希望有人能帮助我!

2 个答案:

答案 0 :(得分:2)

听起来你只是为一个动作结果设置属性。必须为每个需要使用它的单个视图填充Model.Cities数据。

一种解决方案是将其人口迁移到ActionFilter

public class CityListAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        var result = filterContext.Result as ViewResult;
        result.ViewData.Model = //populate model
        base.OnActionExecuted(filterContext);
    }
}

然后将过滤器添加到控制器

[CityList]
public class HomeController : Controller {  
    public ActionResult Index() {
        return View();
    }
}

至于两个表格问题,我没有理由认为你需要一个空表格。

看看正在输出的html并确保它没问题。还要检查正在生成的操作

答案 1 :(得分:1)

更好的方法是创建像MasterController这样的东西,并在其上设置动作方法:

[ChildActionOnly]
public ActionResult SearchForm()
{
    //Get city data, category data etc., create SearchFormModel
    return PartialView(model);
}

我建议您创建强类型视图(类型为ViewUserControl<SearchFormModel>的SearchForms.ascx)。拥有这样的模型也是一个好主意:

public class SearchViewModel
{
    public IList<SelectListItem> Cities { get; set; }
    public IList<SelectListItem> Categories { get; set; }
}

并使用这样的帮助:http://github.com/Necroskillz/NecroNetToolkit/blob/master/Source/NecroNet.Toolkit/Mvc/SelectHelper.cs预先将原始数据转换为DDL友好格式。

在任何情况下,您现在都使用Html.RenderAction()而不是Html.RenderPartial(),并指定您希望“MasterController”中的“SearchForm”操作。