我有一个网页,它为每个部分使用了许多不同的部分视图和不同的视图模型。其中一个部分是用户能够更改其用户名的能力。由于我们现在将允许电子邮件地址作为用户名,因此我希望使用当前电子邮件地址从页面上的另一个部分视图预填充文本框。如何才能正确完成,以便在文本框中填充值,然后在提交给控制器时保存?以下是我正在查看的简短代码段:
观点:
@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);
}
}
}
它就是。
答案 0 :(得分:1)
我最后一次尝试这样做是使用MVC 3,但我确实知道这种技术是有用的。这是一个愚蠢的区别,这就是为什么我先说出来的原因。
您对此尝试非常接近,但您需要将该属性设置为@Value
,而不是@value
。我从未想过为什么资本会产生巨大的变化。 (就像我说的,这是一个愚蠢的区别。)
var val = "Dummy Value";
@Html.TextBoxFor(model => model.NewUsername, new { id = "uName_change", @Value = val })
答案 1 :(得分:0)
以下是我的方法....在主页面中设置一个包含其他视图模型的viewmodel:
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);
}