【问题标题】:No opportunity to override name attribute for @Html.TextBoxFor in asp.net core 3.1在 asp.net core 3.1 中没有机会覆盖 @Html.TextBoxFor 的名称属性
【发布时间】:2021-01-13 19:53:14
【问题描述】:

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

我有下一个 html 帮助代码:

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

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

【问题讨论】:

    标签: asp.net asp.net-core razor html-helper


    【解决方案1】:

    你可以使用TextBox:

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

    或使用asp-forname

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

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

    这是一个演示:

    测试控制器:

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

    结果:

    【讨论】:

    • 也试过了,但是我的属性有一些验证属性(例如必需、范围等),当你使用@Html.TextBox 时没有属性
    • 是的,这是因为模型绑定是和名字绑定的,如果你覆盖了名字,模型绑定验证就会消失,当你使用form传递模型到action时,你会发现属性为空。
    • 像这样:&lt;input data-val="true" data-val-number="The field Property must be a number." data-val-required="Filed Property is required" id="Property" maxlength="8" name="Property" type="text" value="0"&gt;
    • 但是当我使用@Html.TextBoxFor(Model =&gt; Model.Property) - 有用于验证的html属性并且在.net框架中它可以工作(名称被覆盖并且验证工作)
    • 是的,当你不覆盖名字时,像@Html.TextBox("Property",Model.Property,new { maxlength = 8})一样使用,它也有验证
    猜你喜欢
    • 2017-07-10
    • 2011-08-28
    • 2019-07-16
    • 1970-01-01
    • 2015-04-09
    • 2017-05-08
    • 2012-06-17
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多