Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在项目列表上重复时,在ASP.NET MVC3中生成不同的客户端ID_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 在项目列表上重复时,在ASP.NET MVC3中生成不同的客户端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&

我有一个ASP.NETMVC3 Razor视图,它在jQueryUI中呈现客户列表的编辑器。目前,在呈现的html中,类似客户属性的所有客户端id都是相同的。出于显而易见的原因,我想改变这一点

我的主要意见如下:

<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>
...