Частичные ViewModels, Контроллеры, в Razor - PullRequest
2 голосов
/ 23 апреля 2011

Попытка собрать моих уток подряд с помощью MVC3 + Razor!

Наконец-то я понял концепцию «View-Model», чтобы обернуть мои классы сущностей и адаптировать их к View.

Теперь я собираю страницу с частичным представлением , представляющим различные элементы, необходимые для страницы (например, раскрывающиеся списки, формы и т. Д.), Каждый из которых будет представлен моделью представления. 'который отображается на класс сущностей и обратно в мою базу данных.

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

Я просто не могу понять, почему я не могу сгенерировать этот выпадающий список, и как только я сделаю, как главный «контроллер» отображает все это вместе?

Короче говоря, мне любопытно - нужен ли каждому частичному представлению контроллер, даже если он основан на строго типизированной модели?

Разбить его:

My Entity Model-Wrapper (получение всех элементов, доступных из базы данных

* Обновлено * - к рабочему примеру, обратите внимание, я не думаю, что задавал вопрос right раньше, но это даст вам идея того, чего я пытался достичь! Следующий шаг - перенести все эти операции «с» контроллера (и заполнить их в конструкторе по умолчанию для моделей, чтобы потом было легче их использовать).

CharactersListViewModel.cs

Going to move avoid the 'View Model' for now until I get a little more comfortable

Создание частичного представления, в котором отображается раскрывающийся список с идентификатором символов в качестве значения и именем в качестве текста, создание строго типизированного представления, частичное представление

контроллер для главной страницы в разделе:

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 Ответ

2 голосов
/ 23 апреля 2011

Частичное представление предназначено для абстрагирования некоторой HTML / логики представления, чтобы ее можно было повторно использовать в нескольких местах или для повторения (зацикливания).

Хотя у вас может быть действие, которое отображается начастичное и если рассматриваемое частичное имеет какой-то явный доступ к данным, это может быть путь, но если вы просто передаете все необходимые данные от самого контроллера, тогда - нет, вам не нужен контроллер / действиедля него.

Так как вы делаете какой-то явный доступ к данным, я, вероятно, сделаю для него какое-то действие ...

[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")

Конечно, нет ничего плохого в том, как вы это делаете, но я считаю, что сопоставление его с действием может упростить ситуацию в будущем, если вы когда-нибудь захотели извлечь HTML из этого визуализированного частичного представления с помощью запроса ajax иличто-то в этом роде.

Примечания :

  • Попробуйте обернуть объект контекста сущности в использование, чтобы оно могло избавиться от соединения.
  • Youможно использовать ToDictionary для выбора словаря непосредственно из области запроса.
...