Asp.net core 从视图调用操作方法以自动填充表单值

Asp.net core 从视图调用操作方法以自动填充表单值,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我有一个用于创建资源的表单,它有两个要填充的字段。当用户在第一个字段中输入值时,我想自动调用服务器上的操作方法,该方法将确定在第二个字段中使用的值,而用户不必提交表单 例如: 全名-用户输入此值 用户名-视图使用全名中指定的值调用服务器,服务器计算要使用的值,服务器将值传递回视图,视图显示值 是否可以在MVC核心中实现这一点,如果可以,请指出正确的方向 我一直在阅读有关远程验证的内容,我觉得我可能会使用(或滥用)它来实现所需的功能,但我认为有一种方法可以做到这一点 欢迎使用任何指针。远程验

我有一个用于创建资源的表单,它有两个要填充的字段。当用户在第一个字段中输入值时,我想自动调用服务器上的操作方法,该方法将确定在第二个字段中使用的值,而用户不必提交表单

例如:

  • 全名-用户输入此值
  • 用户名-视图使用全名中指定的值调用服务器,服务器计算要使用的值,服务器将值传递回视图,视图显示值
是否可以在MVC核心中实现这一点,如果可以,请指出正确的方向


我一直在阅读有关远程验证的内容,我觉得我可能会使用(或滥用)它来实现所需的功能,但我认为有一种方法可以做到这一点


欢迎使用任何指针。

远程验证只能在不提交表单的情况下进行验证,但不能将值分配给其他字段。就你而言。其实很简单。您可以使用jsonchange事件侦听第一个字段,在事件中,使用ajax访问后台。然后将返回值填入回调函数的第二个字段。下面是一个简单的测试

视图:

结果:

非常有用,但我不喜欢在视图中使用一些松散的Javascript,特别是因为我可能需要在多个视图中使用相同的功能

我最终将脚本转换为一个全局函数,并从
onchange
事件中调用它,如下所示

JS函数 (在
site.js
中)

行动方法

[HttpGet("GetUserNameFromFullName")] // GET rather than POST
public IActionResult GetUserNameFromFullName(string fullName)
{
    var username = fullName.Split(" ");

    return Ok(username.First());
}
型号

public class UserModel
{
    public string FullName { get; set; }
    public string Username { get; set; }
}
查看

@model MvcApp.Models.UserModel

@Html.DisplayNameFor(m => m.FullName)
@Html.TextBoxFor(m => m.FullName, new
{ 
    onchange = $"fullNameToUserName({@Html.IdFor(m => m.FullName)}, {@Html.IdFor(m => m.Username)});"
})

@Html.DisplayNameFor(m => m.Username)
@Html.TextBoxFor(m => m.Username)
这种方法唯一的问题是,对
fullNameToUserName(fullNameId,usernameId)
的调用不是强类型的,如果从多个视图调用此函数,则在某个时候可能会丢失类型


虽然这很好,为我指明了正确的方向,但我对这种方法并不完全满意。就我个人而言,我更喜欢这种方法,因为它更易于重用,并且使我的视图更精简。

我真的希望这不是解决方案——我希望避免编写Javascript,并让C#attributes或tag helpers来处理它,但它似乎没有任何内置功能——除非您碰巧知道其他情况?尽管如此,还是要感谢你,这是一个有效的解决方案!
[HttpGet("GetUserNameFromFullName")] // GET rather than POST
public IActionResult GetUserNameFromFullName(string fullName)
{
    var username = fullName.Split(" ");

    return Ok(username.First());
}
public class UserModel
{
    public string FullName { get; set; }
    public string Username { get; set; }
}
@model MvcApp.Models.UserModel

@Html.DisplayNameFor(m => m.FullName)
@Html.TextBoxFor(m => m.FullName, new
{ 
    onchange = $"fullNameToUserName({@Html.IdFor(m => m.FullName)}, {@Html.IdFor(m => m.Username)});"
})

@Html.DisplayNameFor(m => m.Username)
@Html.TextBoxFor(m => m.Username)