如何在 for 循环中设置 asp-for

Posted

技术标签:

【中文标题】如何在 for 循环中设置 asp-for【英文标题】:How to set asp-for in a for loop 【发布时间】:2019-01-23 12:31:21 【问题描述】:

我有一个 for 循环来在表单上生成字段。

如何根据当前索引设置asp-for的值?

<label asp-for=@("Value" + i) class="control-label"></label> 不起作用。

【问题讨论】:

呃什么?不清楚你在问什么。在 asp-for 中,您传递了 models 属性。您是否将其与 html<label for="someid"> 混淆了?当您遍历一个数组时,您已经拥有对该项目的引用。一世。 . foreach(var item in Model) ... 那么你有一个对item 的引用,所以你可以在asp-for 中使用它,比如asp-for="item.Value"asp-for="item.Name",这取决于你在模型类上的属性是如何命名的 “不起作用”是什么意思? @("Value" + i) 的输出是什么?你期待什么?有错误信息吗? 你不能。为asp-for 传递的值必须是ModelExpression。它不能采用表示属性的通用字符串值。不过,FWIW 拥有 Value1Value2Value3 等属性几乎总是错误的。请改用集合类型:即Values。然后,您在这里尝试做的事情是微不足道的,因为您只是在索引该集合,可以表示为ModelExpression Tseng>>>我的模型有几个属性Value1...Value31。根据某些条件,我需要提供输入字段或隐藏字段。所以for循环更像for(int i = 1; i <= 31; i++) /* tag helper for each property */ Wndrr >>>我得到一个错误InvalidOperationException: Templates can be used only with field access, property access, single... 【参考方案1】:

您可以使用 ether foreachfor 将模型与索引绑定:

@page
@model IndexModel
@
    ViewData["Title"] = "Home page";
    int i = 0;

<form method="post">
    @foreach (var item in Model.Items)
    

        <input asp-for="Items[i]" />
        i++;
    

    @for (int j = 0; j < Model.Items.Count; j++)
    

        <input asp-for="Items[j]" />
    
    <button type="submit">Submit</button>
</form>

以及背后的代码:

public class IndexModel : PageModel

    [BindProperty]
    public List<string> Items  get; set; 

    public void OnGet()
    
        Items = new List<string>  "one", "two", "three" ;
    

    public void OnPost(List<string> items)
    

    

下面是它的工作原理:

在这个控制器中,你有 2 个动作,一个返回一个字符串列表,这些字符串将是模型。第二个动作将接受一个参数作为字符串列表。

[Route("[controller]")]
public class TestController : Controller


    [HttpGet("[action]")]
    public IActionResult Test()
    
        return View(new List<string>  "one", "two", "three" );
    

    [HttpPost("[action]")]
    public IActionResult Test(List<string> Words)
    
        return Ok();
    

现在在我们的测试视图Test.cshtml 文件中,我们希望显示这个字符串列表及其索引,当我们更改这些值时,我们希望能够发布它们。

@model List<string>

@
    int i = 0;


<form method="post">

    @foreach (var item in Model)
    
        <label>@item  - @i</label>
        <input name="Words[@i]" value="@item" />

        i++;
    
    <button type="submit">Submit</button>
</form>

结果如下:

并且在提交表单后,输入字段中的值会出现在字符串列表中,因为html有name属性。

您必须了解标签助手 asp-for 被 Razor 用于在字段上生成各种 html 属性,例如 name/id/data-* 等...您需要的主要是 @987654332 @属性绑定值。

【讨论】:

这与@ChritPratt 提出的想法相同。我一直在寻找类似的东西:@for(int i = 1; i &lt;= 31; i++) &lt;label asp-for="Value"+i /&gt; &lt;input type="number" asp-for"Value"+i /&gt; 这样我就不必为我的 31 个属性写 62 行 我错过了 List 并将其更改为 '@model List'。最终,它运作良好。

以上是关于如何在 for 循环中设置 asp-for的主要内容,如果未能解决你的问题,请参考以下文章

如何让 asp-for 输入标签助手生成驼峰命名法名称?

循环 GetType().GetProperties() 并将每个属性与 asp-for (Razor Pages) 绑定

在 asp-for="object" 内的页面视图(模板)中投射对象

ANDROID:如何在 for 循环中设置按钮?

如何在for循环中设置react ref

在带有隐藏 asp-for 输入的剃须刀页面中使用 foreach 会导致在浏览器控制台中找到具有非唯一 ID 的元素