Моя модель представления контроллера не была заполнена моей моделью динамических представлений - PullRequest
2 голосов
/ 22 августа 2011

Я создаю приложение, которое позволяет мне записывать рецепты.Я пытаюсь создать представление, которое позволяет мне добавить основы рецепта, например, название рецепта, дату рецепта, температуру приготовления и используемые ингредиенты.

Я создаю представление, содержащее некоторый jquery для загрузки частичногоview clientide.

При публикации у меня возникли некоторые проблемы при попытке получить значения из частичного представления, загруженного с помощью jquery.

Вырезанная версия основного вида выглядит так (яизначально требуется 1 частичное представление)

 <div id="ingredients">
         @{ Html.RenderPartial("_AddIngredient", new IngredientViewModel()); }
    </div>
    <script type="text/javascript">
    $(document).ready(function () {
    var dest = $("#ingredients");
    $("#add-ingredient").click(function () {
        loadPartial();
    });
    function loadPartial() {
        $.get("/Recipe/AddIngredient", {}, function (data) { $('#ingredients').append(data); }, "html");
    };
});
</script>

Мой частичный вид выглядит как

<div class="ingredient-name">
   @Html.LabelFor(x => Model.IngredientModel.IngredientName)
   @Html.TextBoxFor(x => Model.IngredientModel.IngredientName)
</div>
<div class="ingredient-measurementamount">
   @Html.LabelFor(x => Model.MeasurementAmount)
   @Html.TextBoxFor(x => Model.MeasurementAmount)
</div>
<div class="ingredient-measurementtype">
  @Html.LabelFor(x => Model.MeasurementType)
  @Html.TextBoxFor(x => Model.MeasurementType)
</div>

Сообщение контроллера

  [HttpPost]
    public ActionResult Create(RecipeViewModel vm,IEnumerable<string>IngredientName,  IEnumerable<string> MeasurementAmount, IEnumerable<string> MeasurementType)
    {

Наконец, моя модель представления выглядит как

 public class IngredientViewModel
{
    public RecipeModel RecipeModel { get; set; }
    public IEnumerable<IngredientModel> Ingredients { get; set; }

}

Мой контроллер довольно уродливый ...... я использую Inumerble, чтобы получить значения для MeasurementAmount & MeasurementType (IngredientName всегда возвращает значение NULL), в идеале я думал, что в httppost Ingredients будет заполнено всесмог бы заполнить ингредиенты

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

Ответы [ 5 ]

2 голосов
/ 27 августа 2011

Почему бы вам не взглянуть на MVC Controlstoolkit

Я думаю, что они будут делать то, что вы хотите.

0 голосов
/ 31 августа 2011

Предполагая, что RecipeViewModel является моделью, поставляемой для частичного представления, попробуйте просто принять это обратно в свой POST-контроллер, как показано ниже:

[HttpPost]
public ActionResult Create(RecipeViewModel vm)
{
  //
}

Вы должны заполнить модель всеми значениями, указанными в форме.

0 голосов
/ 25 августа 2011

Возможная проблема

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

Если вы проверяете элементы с помощью firebug, то элементы в Частичном должны быть названы / идентифицированы следующим образом: Ingredients [x] .Property1, Ingredients [x] .Property2 и т. Д.

В вашей ситуации, когда вы добавляете частичное, они, вероятно, просто называются Property1, Property2 .

Возможное решение

Дайте ваши свойства в вашемчастично правильное имя, которое соответствует вашему списку ингредиентов.Примерно так:

@Html.TextBox("Ingredients[x].Property1","")

Из, после рендеринга вашего частичного просто измените все имена en ID с jquery на правильное значение.

0 голосов
/ 25 августа 2011

Это происходит из-за того, что имена полей из частичного представления не соответствуют стандартному соглашению ModelBinder Вы должны проанализировать, какие поля имен имеют в вашем частичном представлении.

Также вы должны реализовать правильный способ привязки коллекций к контроллеру MVC. Вы можете найти пример в Phil's Haack post

0 голосов
/ 25 августа 2011

Не вдаваясь в подробности.Можете ли вы изменить public ActionResult Create на использование FormCollection вместо модели представления?Это позволит вам увидеть, какие данные поступают, если таковые имеются.Было бы полезно, если бы вы могли опубликовать это тогда.

Ваша модель представления заполняется с помощью Binding - если вы еще не читали об этом, возможно, это хорошая идея.Наконец, я хотел бы рассмотреть возможность объединения ваших списков или перечислений в единую модель представления.

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