2010-07-28 49 views
1

我是新來的MVC!在哪裏和如何加載在masterpage中使用dropdownlists

我想在MasterPage中使用的PartialView中使用兩個DropDownLists(城市,類別),這意味着它們將始終可見。

我試圖在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的兩種形式來觸發?

希望任何人都可以幫助我!

回答

1

更好的辦法來做到這一點,就是要像MasterController創造的東西,有它的操作方法是這樣的:

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

我建議您創建強類型的視圖(SearchForms。 ascx,類型爲ViewUserControl<SearchFormModel>)。此外,它可能是一個好主意,有這樣一個模型:

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」操作。

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,並確保它沒問題。還要檢查正在生成的動作正確地將

+0

嘿大戴夫! Thansks爲您提供幫助! 如果即時通訊使用ActionFilter,我必須把這個actionResult放在每個使用的控制器上,對吧?我閱讀了另一個解決方案,你可以創建一個baseController並在構造函數中加載ddls,並使所有控制器都從BaseController繼承。我試過了,但我完全不明白。你認爲大戴夫怎麼樣? – n3tx 2010-07-28 15:14:00

+0

這應該工作。只需創建一個從Controller繼承的新類(例如BaseController)。然後將您的控制器(以及任何其他需要此操作的控制器)從BaseController而不是Controller繼承。然後,您可以將CityList過濾器應用於BaseController,或者在BaseController的構造函數中設置該值 – 2010-07-28 20:51:51