部分视图中的绑定输入模型需要帮助

时间:2012-04-13 04:10:48

标签: asp.net-mvc asp.net-mvc-3

我想将输入模型从局部视图传递给控制器​​。我对MVC很新,所以仍然试图了解默认模型绑定器的工作原理。

通过AJAX(listBox),控制器传回部分视图并插入表id = searchResults。

@model ViewModels.LocationViewModel
@using (Ajax.BeginForm("ProcessSearch", "SearchR", new AjaxOptions
{
    HttpMethod = "GET",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "searchResults",
}))

{ 
    <div>@Html.ListBoxFor(xxx)</div>
    <input id="Search" type="submit" value="Search" />
}

这是填充局部视图的控制器和ViewModel

public class OrderViewModel
{
    public string Description       { get; set; }
    public string Status            { get; set; }     
}

public ActionResult ProcessSearch(SearchViewModel search)
{
     select new OrderViewModel{
                Status=f.STATUS,
                Description=f.DESCRIPTION}).ToList();
     return PartialView(model);
}

在同一个主视图中,我有这个表单,我希望我想绑定到另一个视图模型。我根本不明白如何从局部视图的模型中实现默认绑定器。如果我没有正确解释,我道歉。我希望这是有道理的。

@using (Html.BeginForm("Testing", "SearchR", FormMethod.Post))
{ 
    <div>@Html.DropDownListFor(yyy)</div>
    <input id="Reshop" type="submit" value="Reshop" />
}
<table id="searchResults"></table>


public ActionResult Testing(RSOrderViewModel rOrder)
{
    return Content("hey");
}

public class RSOrderViewModel 
{
    public string yyy { get; set; }
    public IEnumerable<OrderViewModel> sovm { get; set; }
}


@model List<ViewModels.OrderViewModel>

@{ViewData.TemplateInfo.HtmlFieldPrefix = "sovm";
   }

 <table id="searchResults">
    <tr>
        <th>Order Id</th>
        <th>Order Detail</tr>

@for (int i = 0; i < Model.Count; i++)
{
    <tr>
        <td>
         @Html.DisplayFor(x => x[i].OrderId)
        </td>
        <td>
         @Html.DisplayFor(x => x[i].OrderDetail)
        </td>
    </tr>
}

</table>

1 个答案:

答案 0 :(得分:3)

该表格位于第二种形式之外。因此,当您发送到Testing操作时,发送到控制器的所有内容都是下拉列表的值。如果要发送存储在此表中的集合,则必须使用AJAX或将表格放在表单中:

@using (Html.BeginForm("Testing", "SearchR", FormMethod.Post))
{ 
    <div>@Html.DropDownListFor(yyy)</div>
    <table id="searchResults"></table>
    <input id="Reshop" type="submit" value="Reshop" />
}

现在当然将表放在表单中并不意味着它在您提交表单时会向服务器发送任何内容。您需要输入输入字段(如果您不希望它们对用户可见,则隐藏)将包含将被POST回的值。此外,这些输入字段名称必须遵循standard convention以绑定到列表。

您实际上并没有显示部分视图的外观,但这里是一个示例,说明它的外观如何,以便遵守约定。例如,假设您在OrderViewModel中有2个要绑定的属性:OrderId和OrderDetail:

@model IEnumerable<OrderViewModel>
@{
    // We set the name prefix for input fields to "sovm"
    // because inside your RSOrderViewModel the collection 
    // property you want to bind to this table is called sovm
    // and in order to respect the convention the input names
    // must be in the following form "sovm[0].OrderId", "sovm[1].OrderId", ...
    ViewData.TemplateInfo.HtmlFieldPrefix = "sovm";
}
<thead>
    <tr>
        <th>Order Id</th>
        <th>Order detail</th>
    </tr>
</thead>
<tbody>
    @Html.EditorForModel()
</tbody>

然后你可以有一个编辑器模板,它将为模型的每个元素(~/Views/Shared/EditorTemplates/OrderViewModel.cshtml)呈现:

@model OrderViewModel
<tr>
    <td>@Html.EditorFor(x => x.OrderId)</td>
    <td>@Html.EditorFor(x => x.OrderDetail)</td>
</tr>

模板的名称是您要绑定到的集合中使用的类型的名称(IEnumerable<OrderViewModel> sovm { get; set; } =&gt; OrderViewModel.cshtml)。如果它可以在多个控制器之间重用,或者它特定于~/Views/Shared/EditorTemplates文件夹中当前控制器,其中XXX是当前控制器,则它也必须放在~/Views/XXX/EditorTemplates文件夹中。