Где и как загрузить выпадающие списки, используемые на главной странице - PullRequest
1 голос
/ 28 июля 2010

Я новичок в MVC!

Я пытаюсь использовать два DropDownLists (города, категории) в PartialView, которые будут использоваться в MasterPage, то есть они будут видны все время.

Я пытался загрузить их в HomeCOntroller, но это не сработало. Я получил исключение.

Я читал кое-что о создании baseController, от которого унаследуются другие контроллеры, я пробовал это вроде как, но, думаю, я делаю что-то не так.

Это единственный код, который я получил сегодня:

Masterpage

<% 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 пуст, и я получаю исключение.
  2. Почему я должен использовать две формы для запуска ActionMethod?

Надеюсь, кто-нибудь может мне помочь!

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

Похоже, вы устанавливаете свойство только для одного результата действия. Данные 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 голос
/ 29 июля 2010

Лучший способ сделать это - создать что-то вроде 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() и указываете, что хотите выполнить действие «SearchForm» из «MasterController».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...