2

Это следовать до MVC3 form in partial viewформа в частичном - правильный ответ нужен

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

У меня нет доступа к первоначальному коду, но вот мое (так что я могу ответить на следующие вопросы):

// main view (which is partial too) 
    @foreach (AddingComponentVM sc in Model) 
    { 
     @Html.Partial("_SearchIngredientUpdate", sc);  
    } 

//partial view 
@using (Ajax.BeginForm("IngredientSearchUpdate", new { controller = "Recipe" }, ajxOpt, new { id = "addingWidgetForm" + Model.IngredientID })) 
    {   
     @Html.TextBoxFor(model => model.IngredientID) 
     @Model.IngredientID 
    } 

@ Model.IngredientID содержит правильное значение. Но текстовое поле содержит значение модели, отправленной контроллеру (sic!), И, очевидно, одинаково для каждой формы.

[AjaxOnly] 
public JsonResult IngredientSearchUpdate(
    AddingComponentVM dataIn, 
    [ModelBinder(typeof(SearchOptionsBinder))] SearchOptions sessionSO) 

Если действие без AddingComponentVM в сигнатуре вызывает тот же код выше, формы отображаются корректно.

public PartialViewResult IngredientSearch([ModelBinder(typeof(SearchOptionsBinder))] SearchOptions sessionSO) 

Любой может указать мне на причину этого странного (по крайней мере для меня) поведения? Благодаря!

+1

Я предпочитаю использовать EditorTemplates для отображения таких форм, а не частичных представлений. Частицы склонны действовать иногда странно (хотя, если вы знаете, как это работает, это логично) и имеют неожиданное поведение. – Styxxy

+1

Очень хорошее и интересное предложение. Я все еще хотел бы знать, почему он работает так, как работает! Спасибо –

+0

Я реализовал это с помощью EditorTemplates и точно так же происходит. Существует столкновение с данными, отправленными с POST. По-видимому, так работает TextBoxFor (и т. Д.). Они сначала ищут значения в ViewData, ViewBag, а затем в модели. Все еще нужна помощь в этом. –

ответ

2

Я не мог спать из-за этого, но вот ответ:

Это не имеет значения, используете ли вы PartialView или EditorTemplates. Как описано здесь: How to modify posted form data within controller action before sending to view?

«HTML Помощники используют следующий приоритет заказа при попытке поиска в ключе:.

  1. ViewData.ModelState словарной
  2. свойство
  3. Модели (если сильно типизированный Это свойство ярлык для View.ViewData.Model)
  4. ViewData записи словаря»

Так что, если какие-либо ценности были позы Для этого достаточно очистить коллекцию StateModel, а затем данные из модели можно получить с помощью html helper. Это будет делать трюк:

ModelState.Clear()