【问题标题】:Prepopulate HtmlTextBoxFor with value from another field?使用来自另一个字段的值预填充 HtmlTextBoxFor?
【发布时间】:2015-04-18 11:59:42
【问题描述】:

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

观点:

@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);  
                }
        }


    }

就是这样。

【问题讨论】:

  • 你能发布你的控制器方法吗?
  • 完成了,有一个帖子和一个get。
  • 当你单步执行时,你用来拉回电子邮件地址的方法是否真的有效
  • 是的,页面上的一切都在工作,并显示用户对象上的所有属性(这是一个很长的属性列表)。我只想获取电子邮件地址值,并使用该值在我正在处理的视图中预填充“NewUsername”文本框。

标签: c# .net razor model-view-controller


【解决方案1】:

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

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);
}  

【讨论】:

  • 如果项目被正确重构,则无需传入 Guid 和 NewUser 名称。 Dry 校长在工作……
【解决方案2】:

我最后一次尝试这样做是在 MVC 3 中,但我确实知道这种技术当时有效。这是一个愚蠢的区别,这就是我首先指出的原因。

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

var val = "Dummy Value";

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2019-01-04
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多