Asp.net mvc asp.net mvc中父子关系视图的通用方法

Asp.net mvc asp.net mvc中父子关系视图的通用方法,asp.net-mvc,Asp.net Mvc,显示父实体(DropDownFor/ListBoxFor)及其子实体(razor foreach)的技术方法是什么 我是否应该创建一个Index.cshtml,其中包含父级和子级的razor代码 只是一个旁注:我将EF与ViewModels一起使用,当检索到客户时,孩子们并不急于加载。我在选择客户时显式加载订单 我找不到关于正确方法的任何教程或信息,似乎没有人用Razor做这件事?一种方法是:在DDL的更改事件上,使用JSON加载数据 $('#CustomerDDL').change(func

显示父实体(DropDownFor/ListBoxFor)及其子实体(razor foreach)的技术方法是什么

我是否应该创建一个Index.cshtml,其中包含父级和子级的razor代码

只是一个旁注:我将EF与ViewModels一起使用,当检索到客户时,孩子们并不急于加载。我在选择客户时显式加载订单


我找不到关于正确方法的任何教程或信息,似乎没有人用Razor做这件事?

一种方法是:在DDL的更改事件上,使用
JSON
加载数据

$('#CustomerDDL').change(function (e) {
            url = '@Url.Action("GetCustomerDetails", "Customer")';
            var data = { id: this.value };
            $.post(url, data, function (result) {
                if (result.success) {
                    var detailsList = result.detailsList;
                    var table = "<table>";
                    for (var i = 0; i < detailsList.length; i++) 
                    {
                        table += "<tr>" + 
                                 "<td> detailsList[i].invoice_number + "</td>" +
                                 "<td> detailsList[i].quantity + "</td>" +
                                 //etc...
                                 "</tr>";
                    }
                    table += "</table>";
                }
                else {
                    var table = "<table> no data </table>";
                }

                $('#DivForShowDetails').html(table);
            });
        });
编辑:

你可以这样用另一种方法。主视图,例如
Index.cshtml
包含以下内容:

@using (Ajax.BeginForm("GetDetails", "Customer", new AjaxOptions { UpdateTargetId = "getDetailsResult" }, new { id = "customersForm" }))
{
      @Html.DropDownList("Customer", ViewBag.Customers as IEnumerable<SelectListItem>, new { @onchange="CustomerChanged(this.value);" })

      <input type="hidden" id="hiddencustomer" name="customerId" />  

      <noscript>
         //this button will not shown
         <input type="submit" value="" />
      </noscript>                   
}

//results will shown here after form submit.
<div class="detailsSection" id="getDetailsResult">
      @Html.Partial("Selected_Customer_Details", Model)
</div>

<script>
       function CustomerChanged(cId) 
       {
           //take selected customer
           $('#hiddencustomer').val(cId);

           //submit form
           $('#customersForm').submit();
       }
</script>
在控制器中,您有一个
索引
操作,其中包含客户列表:

public ActionResult Index()
{
    ViewBag.Customers = new SelectList(_ServiceOrRepo.LoadCustomers(), "Id", "Name");

    return View();
}
GetDetails
操作返回
Selected\u Customer\u Details.cshtml
部分视图:

public ActionResult GetDetails(int id)
{
    DetailsModel model = _ServiceOrRepo.LoadCustomerDetailsById(id);
    return PartialView("Selected_Customer_Details", model);
}

我认为GetCustomerDetails操作返回的结果应该是部分结果,以避免javascript中的html构造。如果您确实希望返回json数据,然后在浏览器上构建标记,那么js模板引擎将是一种更干净的方法。我同意返回带有剃刀订单模板的PartialView,这只是一种方式。我们也可以使用Ajax.BeginForm()并在部分视图中显示结果。无论我们是否也这样认为,您能否展示您上一个建议的更多代码?
public ActionResult Index()
{
    ViewBag.Customers = new SelectList(_ServiceOrRepo.LoadCustomers(), "Id", "Name");

    return View();
}
public ActionResult GetDetails(int id)
{
    DetailsModel model = _ServiceOrRepo.LoadCustomerDetailsById(id);
    return PartialView("Selected_Customer_Details", model);
}