2011-04-14 38 views
2

我有一个ASP.NET MVC3 Razor视图,它为jQuery UI手风琴内的客户列表呈现编辑器。此刻,所有客户端ID对于相似客户属性在呈现的HTML中都是相同的。出于显而易见的原因,我想改变这一点。当在项目列表上重复生成时,在ASP.NET MVC3中生成不同的客户端ID

我的主要观点如下:

<div id="accordionKlanten"> 
@foreach (var customer in Model.Customers) 
{ 
    <h3><a href="#">@customer.Name</a></h3> 
    <div>@{ Html.RenderPartial("CustomerData", customer); }</div> 
} 
</div> 

在我CustomerData视图(大大简化):

@using (Ajax.BeginForm("UpdateCustomer", ajaxOptions)) 
{ 
    @Html.LabelFor(model => model.Name) 
    @Html.TextBoxFor(model => model.Name) 
    <input type="submit" value="Opslaan" /> 
} 

这一切都完美的作品:我可以张贴到我UpdateCustomer操作方法中,模型对象被绑定,返回的部分视图返回给客户端。

但是,当我有三个客户,这将呈现在我的HTML与id="Name"三个输入字段。其中一个出错的是<label for="Name">...</label>不起作用,因为Name不是唯一的ID。

有什么办法告诉告诉ASP.NET MVC3呈现不同的id的(同时保留name属性完好无损,因为它们用于绑定到模型)?

为了完整起见,这里所涉及的两个操作方法:

// 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); 
} 

回答

1

使用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> 
} 

你将不得不调整这使用List<Customer>Customer[]

+0

不,不要在视图中使用任何循环。 – 2011-04-14 13:17:21

+0

为什么不呢?自从mvc2以来我就这样做了。 – 2011-04-14 13:18:56

+0

因为自ASP.NET 2.0以来有编辑器/显示模板。查看我的答案了解更多详情。所以循环只在ASP.NET MVC 1.0中需要。从那时起,视图可以更清洁。 – 2011-04-14 13:19:58

7

相反的观点写丑的循环:

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

,并在相应的编辑器模板(~/Views/Shared/EditorTemplates/Customer.cshtml):

@model Customer 
<h3> 
    <a href="#">@customer.Name</a> 
</h3> 
<div> 
    @Html.EditorFor(x => x.FirstName) 
</div> 
<div> 
    @Html.EditorFor(x => x.LastName) 
</div> 
... 

现在编辑器模板将自动执行,以供eac使用您的模型上的Customers集合属性的h元素。唯一的要求是遵守命名惯例:它应该位于~/Views/Shared/EditorTemplates文件夹中,并且应该将其命名为收集项目的类型。因此,例如,如果属性为IEnumerable<CustomerViewModel>,则编辑器模板应该被命名为CustomerViewModel.cshtml,并且显然可以强制输入为CustomerViewModel

就是这样。现在不仅你已经清理了你的视图,而且还会使用专有名称。

+0

好吧,这是现在生成唯一ID的意义。但是,我的模型不再受限制。每个客户都有一个更新,所以我也为每个客户提供一个(Ajax)表单。正确的操作方法('UpdateCustomer')仍然被调用,但其''customer'参数不包含任何值。 – 2011-04-14 13:38:24

+0

原因是模型联编程序需要一个名为Name的属性,但接收名为Customers [0] .Name的属性。我可以在不借助自定义模型绑定器的情况下修复此问题吗? – 2011-04-14 13:45:27

+1

是的,让您的发布操作采用与您的视图模型相同的参数类型。 – 2011-04-14 14:32:08