没有机会覆盖 asp.net 核心 3.1 中 @Html.TextBoxFor 的名称属性

No opportunity to override name attribute for @Html.TextBoxFor in asp.net core 3.1

我们正在将项目从 .net Framework 4.72 迁移到 .net core 3.1。

我有下一个 html 帮助程序代码:

@Html.TextBoxFor(Model => Model.Property, "{0:0}", htmlAttributes: new { maxlength = 8, Name = "Model2.Property" })

但是当我检查 html 代码时,名称属性没有被覆盖。 我怎样才能覆盖它? 谢谢。

您可以使用 TextBox:

@Html.TextBox("Model2.Property",Model.Property,new { maxlength = 8})

或使用 asp-forname:

<input asp-for="@Model.Property" name="Model2.Property" maxlength="8"/>

在表单中传递带有前缀的数据,并在操作中验证它(ModelState.IsValid'),然后return将错误消息显示到您的视图中,但我认为这不是一个好主意,我认为您在控制器操作中不需要前缀:

这是一个演示:

测试控制器:

  public IActionResult TestPrefix([Bind(Prefix = "Model2")]DataModel model) {
        if (ModelState.IsValid) {
            return Ok("success");
        }
        string message=string.Join("; ", ModelState.Values
                     .SelectMany(x => x.Errors)
                     .Select(x => !string.IsNullOrWhiteSpace(x.ErrorMessage) ? x.ErrorMessage : x.Exception.Message.ToString()));

        return Ok(message);
    }
    public IActionResult TestDataModel() {
        return View();
    }

TestDataModel.cshtml:

 <form method="post">
    @Html.TextBoxFor(Model => Model.Property, "{0:0}", htmlAttributes: new { maxlength = 8 })
    <div style="color:red" id="errormessage">@TempData["Error"]</div>
    <button onclick="postModel()">post</button>
</form>
@section scripts{ 
    <script type="text/javascript">
        function postModel() {
            var formdata = new FormData();
            formdata.append("Model2.Property", $("#Property").val());
             $.ajax({
                type: "POST",
                 url: '@Url.Action("TestPrefix", "Test")',
                 contentType: false,
                 processData: false,
                 data: formdata,
             }).done(function (data) {
                 //$("#errormessage").append(data);

    });
        }
    </script>
}

数据模型:

public class DataModel
    {
        [Required]
        [Range(0,5)]
        public int Property { get; set; }
    }

结果: