使用另一个字段的值预填充 HtmlTextBoxFor?

Prepopulate HtmlTextBoxFor with value from another field?

我有一个网页,该网页使用许多不同的部分视图和每个部分的不同视图模型。其中一个部分是为了让用户能够更改他们的用户名。由于我们现在将允许电子邮件地址作为用户名,因此我想使用页面上另一个部分视图中的当前电子邮件地址预填充文本框。如何正确完成此操作,以便将值填充到文本框中,然后在提交给控制器时保存?这是我正在查看的简短代码片段:

观点:

@Html.TextBoxFor(model => model.NewUsername, new { id = "uName_change" }) @Html.ValidationMessageFor(model => model.NewUsername)

这里值得注意的是,我尝试将当前电子邮件地址设置为 ViewData 和 ViewBag,并将“@value = viewdatahere”放入属性文本框,但这并没有填充字符串,它只是留空.

我只需要知道这是怎么做到的。感谢任何帮助。

编辑以添加控制器 POST 和 GET 方法:

[HttpGet]
    [ClaimsPrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Resource = Resources.User, Operation = Operations.Edit)]
    public ActionResult ChangeUsername(Guid uniqueUserId)
    {
        User user = UserManager.GetUser(uniqueUserId);
        AuthorizationHelper.ConfirmAccess(Resources.User, Operations.Edit, user);
        ChangeUsername model = new ChangeUsername(){UserGuid = user.Identifier,NewUsername = user.Username};
        return View(model);
    }

    [HttpPost]
    [ClaimsPrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Resource = Resources.User, Operation = Operations.Edit)]
    public ActionResult ChangeUsername(ChangeUsername changeUsername)
    {
        User usr = UserManager.GetUser(changeUsername.UserGuid);
        AuthorizationHelper.ConfirmAccess(Resources.User, Operations.Edit, usr);

        if (!ModelState.IsValid)
        {
            return View(changeUsername);
        }
        //setup request
        SupportUser su = (SupportUser)ViewData["SupportUser"];
        RequestData rqd = new RequestData(GetApplicationIdentifer(usr), su.clientIP, su.lanID);
        UserUsernameChangeRequest request = new AdminUsernameChangeRequest(rqd,usr,changeUsername.NewUsername);

        UserUsernameChangeResponse response = UserManager.ChangeUserUsername(request);

        if (response.Status == UserProcessorStatus.Success)
        {
            var message = ("User has been updated successfully");
            TempData["message"] = message;
            return PartialView("_NewUsername", changeUsername);
        }

        switch (response.Status)
        {
            case UserProcessorStatus.DuplicateUsername:
                {
                    ModelState.AddModelError("NewUsername", "Duplicate username");
                    changeUsername.AlternateUsernames = response.AlternateUsernames;
                    return PartialView(changeUsername);
                }
            default:
                {
                    ModelState.AddModelError("NewUsername", String.Format("An unexpected error occured. Error Code:{0}, Message:{1}", response.Status, response.Message));
                    return PartialView(changeUsername);  
                }
        }


    }

就是它了。

我会这样做....在主页中设置一个包含其他视图模型的视图模型,如下所示:

public class VMMain(){
     public void VMMain(){
        //don't forget null CTOR as MVC requires it...
     }
     public void VMMain(Guid userguid, string newusername){
        UserGuid = userguid;
        NewUserName = newusername;
        Part1 = new VM1(UserGuid, NewUserName);
        Part2 = new VM2();
        Part3 = new VM3();
     }
     public VM1 Part1 {get;set;}
     public VM2 Part2 {get;set;}
     public VM3 Part3 {get;set;}
     Guid UserGuid {get;set;}
     string NewUsername {get;set;}
}

在您的主视图中,您可以绑定到其中的任何视图模型和属性。只需确保您有一个 属性 可用于绑定。

这会将您的控制器更改为如下所示:

[HttpGet]
[ClaimsPrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Resource = Resources.User, Operation = Operations.Edit)]
public ActionResult ChangeUsername(Guid uniqueUserId)
{
    User user = UserManager.GetUser(uniqueUserId);
    AuthorizationHelper.ConfirmAccess(Resources.User, Operations.Edit, user);
    var model = new VMMain(){UserGuid = user.Identifier,NewUsername = user.Username};

现在您可以像这样绑定说具有 属性 的 Partial ViewModel 1:

  @Html.TextBoxFor(p => model.Part1.NewUsername, 
      new { id = "uName_change" })   
  @Html.ValidationMessageFor(p => model.Part1.NewUsername)

    return View(model);
}  

我上次尝试执行此操作是使用 MVC 3,但我确实知道这种技术当时有效。这是一个愚蠢的差异,这就是为什么我首先指出这一点。

您的尝试非常接近,但您需要将 属性 设置为 @Value,而不是 @value。我从来没有认真研究过为什么首都会产生巨大的变化。 (就像我说的,这是一个愚蠢的区别。)

var val = "Dummy Value";

@Html.TextBoxFor(model => model.NewUsername, new { id = "uName_change", @Value = val })