Как получить данные модели из частичного представления? - PullRequest
2 голосов
/ 24 сентября 2010

Я создаю сайт, на котором я использую частичные представления для отображения различных фрагментов данных об одной модели.Вот немного HTML.(Обратите внимание, что все они содержатся в одной форме, и страница Index, на которой отображаются эти частичные данные, строго типизирована для главной модели. Основная модель содержит различные списки данных.)

<div id="tab1"><% Html.RenderPartial("Tab1", Model); %></div>
<div id="tab2"><% Html.RenderPartial("Tab2", Model.AnItemList1.FirstOrDefault<AnItemList1>()); %></div>
<div id="tab3"><% Html.RenderPartial("Tab3", Model.AnItemList2.FirstOrDefault()); %></div>

Здесьэто ОДИН из заголовков частичных представлений (для 'tab2'):

<%@ Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AnItem1>" %>

Страницы отображаются правильно.Проблема заключается в том, что, когда я вводю данные в различные части частичных страниц, а затем отправляю всю форму (через POST), данные не возвращаются обратно в мое хранилище данных (MSSQL) - но это происходит только для любого изэлементы списка (которые содержатся в модели).Первая частичная страница правильно имеет свои данные в хранилище данных.

Что я здесь не так делаю?Должен ли я только передать модель в Html.RenderPartial, а затем получить нужную модель на неполной странице?Должен ли я пройти весь список, а затем получить первый (прямо сейчас, я забочусь только о первом элементе в списке - который изменится ВСЕГДА, но не в ближайшее время).

Предложения или мысли приветствуются.

Обновление : Вот как я получаю доступ к свойствам в частичных представлениях.

<div class="data-group">
    <%: Html.CheckBoxFor(model => model.Property1) %>
    <%: Html.LabelFor(model => model.Property1) %>
</div> 

Обновление 2 : По запросу ...

Действие контроллера (ScenarioController):

    public ActionResult Index(int id = 0)
    {
        if (id == 0)
        {
            SavedScenario scenario = new SavedScenario();
            scenario.AnItemList1.Add(new AnItem1());
            scenario.AnItemList2.Add(new AnItem2());
            return View("Index", scenario);
        }
        else
        {
            SavedScenario scenario = repository.GetScenario(id);

            if (scenario == null)
                return View("NotFound");
            else
                return View("Index", scenario);
        }
    }

    [HttpPost]
    public ActionResult Index(SavedScenario scenario)
    {
        if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario"))
        {
            repository.Add(scenario);
            repository.Save();
        }

        return View(scenario);
    }

Визуализированный HTML (я могу включать только его части - это небольшой пример того, что находится в форме):

<form action="/Scenario" id="form0" method="post">
    <!-- This is the one that works - the basic Scenario. Top level. -->
  <fieldset>
    <legend>Scenario Information</legend>

    <div class="data-group">
        <div class="editor-label">
            <label for="ScenarioName">Scenario Name</label>

        </div>
        <div class="option1">
            <input class="wide" id="ScenarioName" name="ScenarioName" type="text" value="" />
        </div>
        <div class="validation">
            <div><span class="field-validation-valid" id="ScenarioName_validationMessage"></span></div>
        </div>
    </div>
  </fieldset>   

<!-- This does not work or get submitted (as far as I can tell). -->
<div id="tab2">
<fieldset>
    <legend>Tab2</legend>
    <div class="data-group">
        <input id="Property1" name="Property1" type="checkbox" value="true" /><input name="Property1" type="hidden" value="false" />
        <label for="Property1" />
    </div> 
</div>
</fieldset>

</form>

Приношу свои извинения за то, что я держу это в общих чертах.

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

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

Редактировать : имена полей формы должны соответствовать именам свойств вашей модели, чтобы правильно связатьвсе значения.У вас есть два поля с одинаковыми именами, которые вы можете связать следующим образом

[HttpPost]
    public ActionResult Index(SavedScenario scenario, List<bool> Property1)
    {
        // here you can do with values coming in property1
        if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario"))
        {
            repository.Add(scenario);
            repository.Save();
        }

        return View(scenario);
    }
0 голосов
/ 24 сентября 2010

Возможно, проблема с именами полей в ваших частичных формах.Попробуйте назвать поля в ваших частичных представлениях, добавив в них префикс к названию модели, переданной в него ... как 'AnItemList1.name' вместо 'name' .. Хотя я просто догадываюсь здесь ... но это то, что я иногда делалчтобы решить проблему, когда я получал значения как ноль ..

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