Как не потерять коллекцию, которая заполняет DropDownList в ASP MVC 3? - PullRequest
1 голос
/ 04 мая 2011

Я новичок в ASP MVC 3 и у меня следующий вопрос. У меня есть форма, которая отправляет запрос на себя, чтобы отправить данные на сервер. Форма содержит DropDownList для продавцов, и этот список заполняется из базы данных. Основное действие выглядит так:

public ActionResult Index()
{
    var viewModel = new OrderSearchViewModel();
    viewModel.SalesPeople = GetSalesPeopleList(); // This queries the DB
    return View(viewModel);
}

И ViewModel выглядит так:

public class OrderSearchViewModel
{
        public string Id { get; set; }
        public DateTime? StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public string PostCode { get; set; }
        public int SalesPersonId { get; set; }
        public string SalesPersonRef { get; set; }
        public int OrderType { get; set; }
        public string SerialNo { get; set; }
        public string CustomerPO { get; set; }
        public List<SalesPerson> SalesPeople { get; set; }
}

Таким образом, в представлении «Индекс» при отправке формы для списка SalesPeople устанавливается значение NULL (в методе Index HttpPost), и я хочу показать то же представление с заполненным списком. Тем не менее, чтобы сделать это, мне пришлось бы снова запросить базу данных. Как лучше всего избегать этого?

EDIT:

Мой код метода POST Index выглядит примерно так:

[HttpPost]
public ActionResult Index(OrderSearchViewModel viewModel)
{
   var result = QueryOrders(viewModel);
   //code update the model with the results
   return View(viewModel);
}

Ответы [ 3 ]

0 голосов
/ 04 мая 2011

Метод индекса POST должен получать все значения для SalesPeople из FormCollection. Вы всегда можете использовать Request.FormCollection для запроса всех данных формы. Другой выбор - это кеширование данных БД :). В любом случае, пожалуйста, прикрепите код метода POST

0 голосов
/ 04 мая 2011

У вас не должно быть коллекции SalesPeople в вашей OrderSearchViewModel, поскольку она нарушает принцип единой ответственности.Вы должны переопределить EditorTemplate для SalesPersonId и создать отдельное действие, которое будет отвечать за заполнение раскрывающегося списка.

Вот код из моего приложения, вы можете использовать его в качестве примера.Обратите внимание, что мое свойство CategoryId имеет тип Guid - вам следует заменить Guid?с int?.

Переопределение шаблона с использованием mvcextensions:

    public class CreateAccidentCommandMetadata : ModelMetadataConfiguration<CreateAccidentCommand>
{
    public CreateAccidentCommandMetadata()
    {
        Configure(x => x.TrackingNumber)
            .Required();

        Configure(x => x.CategoryId)
            .Required()
            .DisplayName("Category")
            .Template(MVC.Accident.Views.EditorTemplates.Category);
    }
}

Содержимое шаблона:

@model Guid?
@{Html.RenderAction(MVC.Category.List(ViewData.ModelMetadata, Model));}

Действие Category.List:

    public virtual ActionResult List(ModelMetadata modelMetadata, Guid? selected)
    {
        ViewData.Model = queryService.GetList(new GetCategoryListQueryContext())
            .Select(x => new SelectListItem
                             {
                                 Text = x.Name,
                                 Value = x.Id.ToString(),
                                 Selected = selected.HasValue && x.Id == selected
                             })
            .ToList();

        //it is important to set up ModelMetadata after model
        ViewData.ModelMetadata = modelMetadata;

        return View();
    }

и довольно простой вид:

@model IEnumerable<SelectListItem>
@Html.DropDownList(ViewData.ModelMetadata.PropertyName, Model)
0 голосов
/ 04 мая 2011

Отправьте форму, используя Ajax, и просто верните результат операции post клиенту, используя json - таким образом, база данных не попадет дважды в этот список, и пользователь также получит более плавный опыт.

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