@ mj1313's answer был чрезвычайно полезен, но мне не понравилась идея, что в моих представлениях есть некоторая потеря Javascript, тем более что мне может понадобиться использовать эту же функциональность в нескольких представлениях.
В итоге я преобразовал скрипт в глобальную функцию и вызвал его из события onchange
следующим образом.
JS Функция (в site.js
)
function fullNameToUserName (fullNameId, usernameId) {
$.ajax({
type: "get", // GET rather than POST
url: "/User/GetUserNameFromFullName",
data: {
fullname: $(fullNameId).val()
},
success: function (result) {
$(usernameId).val(result);
}
})
}
Метод действия
[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)
не является строго типизированным, и если эта функция вызывается из нескольких представлений, она, вероятно, будет неправильно напечатана в какой-то момент.
Хотя ответ @ mj1313 был замечательным и направил меня в правильном направлении, я не был полностью удовлетворен подходом. Лично я предпочитаю этот подход, так как он немного более пригоден для повторного использования и делает мой взгляд более скудным.