首页 > 解决方案 > 如何在 for 循环中设置 asp-for

问题描述

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

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

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

标签: razorasp.net-coretag-helpersasp.net-core-tag-helpers

解决方案


您可以使用 etherforeach或将模型与索引绑定for

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

结果如下:

结果

name并且在提交表单后,由于 html属性,输入字段中的值将出现在字符串列表中。

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


推荐阅读