Возврат модели представления в контроллер из действия клиента Form.Submit - PullRequest
0 голосов
/ 08 июня 2011

У меня есть контроллер с двумя методами индексации:

public ActionResult Index()
{
    viewModel.PipelineIndex pivm = new viewModel.PipelineIndex(null, User.Identity.Name);
    return View(pivm);
}

[HttpPost]
public ActionResult Index(viewModel.PipelineIndex model, FormCollection collection)
{
    viewModel.PipelineIndex pivm = null;
    if (ModelState.IsValid)
    {
        string key = collection.AllKeys[0];
        string ID = collection.Get(key).ToString();
        pivm = new viewModel.PipelineIndex(ID, User.Identity.Name);
    }
    else
        pivm = new viewModel.PipelineIndex(null, User.Identity.Name);

    return View(pivm);

}

Используемая мной ViewModel - это четко определенный класс:

public class PipelineIndex
{
    private Models.Context _db = new Models.Context();

    public List<SelectListItem> GroupList { get; set; }
    public List<string> ButtonCaptions { get; set; }
    public List<ContactDetail> ContactList { get; set; }
    public string PageTitle { get; set; }
    ...

Представление использует ViewModel для настройки сетки и раскрывающегося списка:

@model BlueSkies.Pipeline.ViewModels.PipelineIndex
@{ ViewBag.Title = "Index"; }
@using (Html.BeginForm()) 
{
    <h2>@Model.PageTitle</h2>
    <div style="clear:both">
        @if (Model != null)
        {
            var grid = new WebGrid(canPage: true, rowsPerPage: 15, canSort: true, ajaxUpdateContainerId: "grid");
            grid.Bind(Model.ContactList, rowCount: Model.ContactList.Count, autoSortAndPage: true);
            grid.Pager(WebGridPagerModes.All);
            @grid.GetHtml(htmlAttributes: new { id = "grid" },
            columns: grid.Columns(
                grid.Column(format: (item) => Html.ActionLink("View", "Details", "Contacts", new { ID = item.Name }, null)),
                grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", "Contacts", new { ID = item.Name }, null)),
                grid.Column("Name"),
                grid.Column(columnName: "Phone1", header: "Phone")
            ));
        }
    </div>
    <hr />
    <div>
        @*foreach (string caption in ViewBag.ButtonCaptions)
        { 
            @Html.ActionLink(caption, "Index", "Pipeline", new { ID = caption }, new { @class = "menuSubButton" })
        }*@
        @Html.DropDownList("GroupDropDown", Model.GroupList, new { @onchange = "this.form.submit()" }) &nbsp; Select a pipe section...
    </div>
}

Когда я испытываю трудности, выпадающий список запускает Form.Submit (при событии onChange). Ни одна модель не возвращается на мой контроллер. У меня есть FormCollection, но я бы предпочел обновленную модель , включая новый selectedItem в раскрывающемся списке. Что мне не хватает? И да, я ищу решение на основе не-JS на данный момент - или как можно ближе. Я не хочу AJAX эту страницу.

ТИА

ПРИМЕЧАНИЕ: похожий вопрос здесь . Он основан на AJAX, но получает ту же нулевую модель при вызове в контроллер. Почему так трудно найти правильный ответ ? :)

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Я думаю, что в визуализированной HTML-форме будет выделение с именем "GroupDropDown", верно?В этом случае выбранное значение будет отправлено обратно при отправке с этим именем и будет привязано либо к параметру с именем groupDropDown, либо к строковому свойству GroupDropDown в классе вашей модели.У вас есть такая собственность на вашей модели?

0 голосов
/ 08 июня 2011

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

Похоже, что бизнес-проблема заключается в том, чтобы «выбрать один элемент из выпадающего списка и соответствующим образом отобразить содержимое».Если это правильно, нет необходимости возвращать все содержимое модели представления;вам нужно только вернуть идентификатор, который демонстрируется много раз на многих сайтах.

Я что-то упустил?

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