2

这是部分视图中对 MVC3 表单的跟进

尽管作者给出了解决该问题的方法。我想找出一个正确的答案,为什么这不起作用。

我无法访问原始代码,但这是我的(所以我可以回答以下问题):

// 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 包含正确的值。但是文本框包含发送到控制器的模型的值(原文如此!),显然每种形式都是相同的。

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

如果签名中没有添加组件VM 的操作调用上述相同的代码,则表单会正确呈现。

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

任何人都可以指出这种奇怪(至少对我而言)行为的原因吗?谢谢!

4

1 回答 1

2

因为这个我睡不着,但这是答案:

使用 PartialView 还是 EditorTemplates 都没有关系。如此处所述:如何在发送到视图之前在控制器操作中修改已发布的表单数据?

“HTML 助手在尝试查找键时使用以下顺序优先级:

  1. ViewData.ModelState 字典条目
  2. 模型属性(如果是强类型视图。此属性是 View.ViewData.Model 的快捷方式)
  3. ViewData 字典条目"

因此,如果发布了任何值,则足以清除 StateModel 集合,然后可以通过使用的 html 助手获取模型中的数据。这可以解决问题:

ModelState.Clear()
于 2012-08-04T23:18:04.667 回答