.Net Core Ajax 表单提交不返回非绑定模型属性

Posted

技术标签:

【中文标题】.Net Core Ajax 表单提交不返回非绑定模型属性【英文标题】:.Net Core Ajax form submit not returning non binded model property 【发布时间】:2021-07-24 17:34:28 【问题描述】:

我有带有表单 ajax 提交的 .Net 核心 Web 项目。在加载表单时,我将所有属性值设置为视图模型。但是在发布时,它只返回绑定到 html 输入的属性。其他值将变为空。如何获取我传递给表单的所有视图模型属性。

控制器

    public IActionResult General(string templateId)
    
        return View(new TemplateGeneralViewModel  Id = "12-3", Name = "Name", Code = "code" );

    
    [HttpPost]
    public IActionResult General(TemplateGeneralViewModel model)
    
        return View();
    

Cshtml

<form asp-area="AdminPanel" asp-controller="Template" asp-action="General"
      method="post" data-ajax-begin="OnFormAjaxBegin" data-ajax-complete="OnFormAjaxComplete"
      data-ajax-failure="OnFormAjaxFailed" data-ajax-success="OnFormAjaxSuccess"
      data-ajax="true" data-ajax-method="POST">
   
    <div class="form-group">
        <label for="tf1">Id</label>
        <input type="email" asp-for="Id" class="form-control" id="tf1" aria-describedby="tf1Help" placeholder="e.g. johndoe@looper.com">
        <small id="tf1Help" class="form-text text-muted">We'll never share your email with anyone else.</small>
    </div>
    <div class="form-group">
        <label class="form-control-label" for="tfValid">Name</label>
        <input type="text" asp-for="Name" class="form-control is-valid" id="tfValid">
        <div class="valid-feedback"> Success! You've done it. </div>
    </div>
   
</form>

查看模型

public class TemplateGeneralViewModel

    public string Id  get; set; 
    public string Name  get; set; 
    public string Code  get; set; 



这里的属性“代码”在提交时为空。如何在不使用任何隐藏字段的情况下获取此值?

【问题讨论】:

同时添加.cshtml文件代码 【参考方案1】:

请记住,在 Post 操作中返回的模型与在 Get 操作中返回的模型实例不同。使用 html 中存在的数据重新构建。您的 cshtml 中 code 属性的字段在哪里?因此,当重新创建模型以在 post 操作中将其传回时,无法给出任何值。

只需添加字段,如果不想显示,请添加样式以隐藏它

<div class="form-group">
    <label class="form-control-label" for="tfValid">Name</label>
    <input type="text" asp-for="Name" class="form-control is-valid" id="tfValid">
    <div class="valid-feedback"> Success! You've done it. </div>
</div>

<div class="form-group">
    <input type="text" asp-for="code" class="d-none">
</div>

【讨论】:

【参考方案2】:

您可以尝试使用asp-route-value 传递查询字符串中的其他数据,您可以参考anchor tag helpers 的官方文档。这是一段将Id、Name 和Code 传递给操作的示例代码:

<form asp-area="AdminPanel" asp-controller="Template" asp-action="General"
      method="post" data-ajax-begin="OnFormAjaxBegin" data-ajax-complete="OnFormAjaxComplete"
      data-ajax-failure="OnFormAjaxFailed" data-ajax-success="OnFormAjaxSuccess"
      data-ajax="true" data-ajax-method="POST" asp-route-Code="@Model.Code">
   
    <div class="form-group">
        <label for="tf1">Id</label>
        <input type="email" asp-for="Id" class="form-control" id="tf1" aria-describedby="tf1Help" placeholder="e.g. johndoe@looper.com">
        <small id="tf1Help" class="form-text text-muted">We'll never share your email with anyone else.</small>
    </div>
    <div class="form-group">
        <label class="form-control-label" for="tfValid">Name</label>
        <input type="text" asp-for="Name" class="form-control is-valid" id="tfValid">
        <div class="valid-feedback"> Success! You've done it. </div>
    </div>
   
</form>

【讨论】:

以上是关于.Net Core Ajax 表单提交不返回非绑定模型属性的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET CORE 表单中使用 AJAX 返回 JSON

单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)

.NET Core MVC - 带有前缀绑定的 AJAX POST 请求

PartialViewResult 表单不会清除 ajax 结果上的值 - ASP.NET Core Razor c#

ASP.NET MVC 网站开发总结——Ajax异步提交表单之检查验证码

如何在 ASP.NET MVC 中通过 Ajax 提交表单?