Asp.net mvc 在项目列表上重复时,在ASP.NET MVC3中生成不同的客户端ID
我有一个ASP.NETMVC3 Razor视图,它在jQueryUI中呈现客户列表的编辑器。目前,在呈现的html中,类似客户属性的所有客户端id都是相同的。出于显而易见的原因,我想改变这一点 我的主要意见如下:Asp.net mvc 在项目列表上重复时,在ASP.NET MVC3中生成不同的客户端ID,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我有一个ASP.NETMVC3 Razor视图,它在jQueryUI中呈现客户列表的编辑器。目前,在呈现的html中,类似客户属性的所有客户端id都是相同的。出于显而易见的原因,我想改变这一点 我的主要意见如下: <div id="accordionKlanten"> @foreach (var customer in Model.Customers) { <h3><a href="#">@customer.Name</a></h3&
<div id="accordionKlanten">
@foreach (var customer in Model.Customers)
{
<h3><a href="#">@customer.Name</a></h3>
<div>@{ Html.RenderPartial("CustomerData", customer); }</div>
}
</div>
这一切都很完美:我可以发布到我的UpdateCustomer
操作方法,绑定模型对象并返回一个局部视图,该视图被渲染回客户端
但是,当我有三个客户时,这会在我的html中呈现三个带有id=“Name”
的输入字段。问题之一是,…
不起作用,因为名称
不是唯一的id
有没有办法告诉ASP.NET MVC3呈现不同的id
(同时保持名称
属性不变,因为这些属性用于绑定到模型)
为完整起见,以下是涉及的两种操作方法:
// Returns view that renders editor for each customer.
public ActionResult Index()
{
var customers = _customerService.GetCustomers();
return View(new CustomersViewModel { Customers = customers });
}
// Updates a customer and returns a partial view.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateCustomer(CustomerDto customer)
{
// Update customer in database.
return PartialView("CustomerData", customer);
}
在主视图中使用
for
循环,而不是foreach
循环
@for (var i = 0; i < Model.Customers.Count; i++)
{
<h3><a href="#">@customer.Name</a></h3>
<div>@{ Html.RenderPartial("CustomerData", Model.Customers[i]); }</div>
}
for(var i=0;i您必须对此进行调整,以使用
列表
或客户[]
而不是在视图中编写丑陋的循环:
<div id="accordionKlanten">
@foreach (var customer in Model.Customers)
{
<h3><a href="#">@customer.Name</a></h3>
<div>@{ Html.RenderPartial("CustomerData", customer); }</div>
}
</div>
现在,将为模型上的Customers
集合属性的每个元素自动执行Customer
编辑器模板。唯一的要求是遵守命名约定:它应该位于~/Views/Shared/EditorTemplates
文件夹中,并且应该以集合项的类型命名。因此,例如,如果属性是IEnumerable
,则编辑器模板应命名为CustomerViewModel.cshtml
,并且显然强类型为CustomerViewModel
就这些。现在,不仅您已经清理了视图,而且还将使用专有名称。不,不要在视图中使用任何循环。因为ASP.NET 2.0提供了编辑器/显示模板。更多细节请参见我的答案。因此,在ASP.NETMVC1.0中只需要循环。因为那时的视图可以更干净。好的,这在现在生成唯一id的意义上起作用。但是,我的模型不再绑定到。我为每个
客户提供了一个更新,因此我也为每个客户提供了一个(Ajax)表单。仍会调用正确的操作方法(UpdateCustomer
),但其customer
参数不包含任何值。原因是模型绑定器需要名为name
的属性,但收到名为Customers[0]的属性。name
。我可以在不使用自定义模型活页夹的情况下修复此问题吗?是的,让您的后期操作采用与视图模型相同的参数类型。我理解这一点,但我希望每个客户都有后期操作,而不是整个客户列表。一次更新的客户不会超过一个,那么为什么要浪费带宽发布客户列表呢?我也有同样的问题,如果不深入了解mvc,我真的找不到解决的办法,我没有时间这么做。
<div id="accordionKlanten">
@foreach (var customer in Model.Customers)
{
<h3><a href="#">@customer.Name</a></h3>
<div>@{ Html.RenderPartial("CustomerData", customer); }</div>
}
</div>
<div id="accordionKlanten">
@Html.EditorFor(x => x.Customers)
</div>
@model Customer
<h3>
<a href="#">@customer.Name</a>
</h3>
<div>
@Html.EditorFor(x => x.FirstName)
</div>
<div>
@Html.EditorFor(x => x.LastName)
</div>
...