我是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" />
<% } %>
两个问题:
希望有人能帮助我!
答案 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”操作。