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 2012-08-03 15:03:10

+1

非常好和有趣的建议。我仍然想知道为什么它的工作方式起作用!谢谢 – 2012-08-03 15:13:41

+0

我用EditorTemplates实现了这一点,并发生了完全相同的事情。与POST一起发送的数据发生冲突。显然这就是TextBoxFor(等)的工作原理。他们首先在ViewData,ViewBag和模型中搜索值。仍然需要帮助。 – 2012-08-04 22:16:42

回答

2

因为这样,我无法入睡,但这里的答案:

不要紧,您是否使用PartialView或EditorTemplates。这里描述:

  1. ViewData.ModelState字典项
  2. Model属性(如强 类型的视图此属性:How to modify posted form data within controller action before sending to view?

    “试图关键的查找时HTML辅助使用下列优先顺序是一个捷径View.ViewData.Model)

  3. ViewData字典条目”

因此,如果任何值分别为正这足以清除StateModel集合,然后通过使用html helper可以获取模型中的数据。这将做的伎俩:

ModelState.Clear()