Ajax.BeginForm中的@ Html.Partial不会将数据发布到操作中

时间:2011-09-14 05:28:15

标签: asp.net-mvc razor

当我尝试发布数据并从具有局部视图的视图调用动作时,我没有获得部分视图的模型数据,但是当我直接使用它而不是部分视图时,它会正确地发送数据。

<div id="mydiv">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
    {        
        //Does not send data to action on post  
        @Html.Partial("ViewUserControl1",Model.Emps)
        //ViewUserControl1 contains the same next 8 line logic.
        OR

        //Send the data to actions on post.
        for (int i = 0; i < Model.Emps.Count(); i++)
        {
            @Html.TextBoxFor(x => x.Emps[i].Name)
            @Html.TextBoxFor(x => x.Emps[i].Address)
            @Html.ValidationMessageFor(x => x.Emps[i].BBString)
        <br />    
        }

        <input id="dosomething" type="submit" value="save" />
    }
</div>


///On Controller 
   [HttpPost]
   public ActionResult Index1(MyModel model)
   {
      ///Here i am looking for the model data which is null for partial.
      return View(model);
   }

MyModel有一个Emps列表{Name,Address}

有没有人知道这个的原因。

2 个答案:

答案 0 :(得分:2)

我怀疑你的ViewUserControl1部分是这样的(你没有显示它,你只是说它看起来像下面的8行,但显然它看起来不是那8行因为它使用了不同的视图模型):

@model IEnumerable<Employee>

for (int i = 0; i < Model.Count(); i++)
{
    @Html.TextBoxFor(x => x[i].Name)
    @Html.TextBoxFor(x => x[i].Address)
    @Html.ValidationMessageFor(x => x[i].BBString)
    <br />    
}

注意lambdas中缺少Emps属性?这会为输入字段生成无效名称,并且默认模型绑定器在您回发时不会获取值。

我建议您使用编辑器模板而不是部分视图,如下所示:

<div id="mydiv">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
    {        
        @Html.EditorFor(x => x.Emps)
        <input id="dosomething" type="submit" value="save" />
    }
</div>

然后只在~/Views/SomeControllerName/EditorTemplates/Employee.cshtml内:

@model Employee
@Html.TextBoxFor(x => x.Name)
@Html.TextBoxFor(x => x.Address)
@Html.ValidationMessageFor(x => x.BBString)
<br/>

将为Emps集合的每个元素呈现编辑器模板,这样您就不需要编写任何循环。它将为输入字段生成专有名称,以便默认模型绑定器能够在回发时填充值。编辑器模板位置很重要。它必须放在~/Views/Shared/EditorTemplates内(如果您希望在多个控制器之间重用)或~/Views/SomeControllerName/EditorTemplates内(如果您希望它只在给定控制器的视图之间重用)。模板的名称也很重要。它应该被称为与集合的类型相同。因此,例如,如果视图模型中有属性public IEnumerable<Employee> Emps { get; set; },则必须将模板调用Employee.cshtml,以便为此集合的每个元素自动呈现它。

答案 1 :(得分:0)