You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#帮助台应用中@Html.TextBoxFor添加readonly=true属性报错求助

解决ASP.NET MVC中ReadOnly文本框无法传递值的问题

嘿,我碰到过好多次这个问题啦——当你给TextBoxFor加上readonly=true之后,表单提交时这个字段的值就没法传到后台了,对吧?这其实是HTML的默认行为:浏览器不会提交带有readonly属性的表单控件的值。给你几个靠谱的解决方案,挑适合你的来用:

方案1:用隐藏字段配合只读显示控件

这个方法最稳妥,既保证值能正常提交,又不让用户修改显示的内容。核心思路是用HiddenFor来负责传递值,同时用一个只读的文本框或者普通标签来展示用户信息:

<div class="form-group">
    @Html.LabelFor(model => model.RaisedBy, htmlAttributes: new { @class = "control-label col-md-2"})
    <div class="col-md-10 ">
        <!-- 隐藏字段负责提交值到后台 -->
        @Html.HiddenFor(model => model.RaisedBy, new { @Value = User.Identity.Name.ToString() })
        <!-- 只读文本框用来展示,用户没法修改 -->
        @Html.TextBox("RaisedByDisplay", User.Identity.Name.ToString(), new { @class = "form-control", @readonly = true })
        <!-- 也可以用更简洁的span标签:<span class="form-control">@User.Identity.Name</span> -->
    </div>
</div>

方案2:禁用控件+后台手动赋值

如果不想加额外的控件,你可以用disabled属性让文本框不可编辑,然后在后台的Action里手动给模型的RaisedBy字段赋值,不要依赖表单提交的值:

前端代码

<div class="form-group">
    @Html.LabelFor(model => model.RaisedBy, htmlAttributes: new { @class = "control-label col-md-2"})
    <div class="col-md-10 ">
        @Html.TextBoxFor(model => model.RaisedBy, new { @Value = User.Identity.Name.ToString(), @disabled = true, @class = "form-control" })
    </div>
</div>

后台Action示例

[HttpPost]
public ActionResult Create(YourTicketModel model)
{
    // 手动从当前登录用户获取值,覆盖表单提交的空值
    model.RaisedBy = User.Identity.Name;
    
    // 后续验证和保存逻辑
    if (ModelState.IsValid)
    {
        db.Tickets.Add(model);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    
    return View(model);
}

这个方法的好处是前端结构简单,但要记得后台必须手动赋值,不然模型里的RaisedBy会是空的。

方案3:用JS强制提交只读控件的值(不推荐)

这个方法是应急用的,通过JavaScript在表单提交前移除readonly属性,让浏览器能提交值。不过要注意,用户可以通过浏览器控制台修改JS或者直接修改控件值,有安全风险,所以不太推荐:

前端代码

<div class="form-group">
    @Html.LabelFor(model => model.RaisedBy, htmlAttributes: new { @class = "control-label col-md-2"})
    <div class="col-md-10 ">
        @Html.TextBoxFor(model => model.RaisedBy, new { @Value = User.Identity.Name.ToString(), @readonly = true, @class = "form-control" })
    </div>
</div>

JavaScript代码(放在页面底部或脚本块)

$('form').submit(function() {
    // 提交前移除readonly属性,让浏览器提交值
    $('#RaisedBy').removeAttr('readonly');
});

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:42