认为这可能是一个简单的问题,但我无法弄清楚如何在C#(EntityFramework 6 MVC ASP.NET)中将视图中的值传递给viewmodel。
不幸的是,我是C#的新手(即使不是编程,WebApps,JS等) - 但这种Razor语法每次都让我感到高兴。 ;)
我有这个div并且通过点击它可以将人的id作为我的viewmodel中的变量。然后我想在Controller中使用它。
以下是我的观点:
<div class="employee_login" id="@Html.DisplayFor(modelItem => item.Pid)" onclick="@Model.userid = @Html.DisplayFor(modelItem => item.Pid)">
<p>@Html.DisplayFor(modelItem => item.FirstName) @Html.DisplayFor(modelItem => item.LastName) | Kennung: @Html.DisplayFor(modelItem => item.Pid)</p>
</div>
视图模型:
public class LoginViewModel
{
....
[NonSerialized]
public int userid;
}
不幸的是,它呈现给以下HTML:
我读到通过viewmodel将视图中的值传递给Controller是一种很好的做法,这正是MVVM-Architecture所展示和想要的。如果通常通过http或其他方式来做,请告诉我。
请原谅我这是一个简单的问题,几分钟后就解决了。
谢谢你,祝你有愉快的一天,
尼科
答案 0 :(得分:1)
首先你需要在视图上添加一个隐藏字段
@Html.HiddenFor(model => model.userid)
然后使用javascript函数设置模型值
function updateID(val)
{
document.getElementById('userid').value = val;
}
并在div上调用updateID函数单击
我认为这会对你有所帮助......
答案 1 :(得分:1)
所以这是一个很好的解决方案(感谢@NikhilVC)。
我想要的是: 在ASP.NET WebApp(MVC6 EntityFramework CodeFirst)的Default-Login-View中,应该有一个所有用户的列表,通过单击一个用户并输入用户应该登录的密码。但ASP.NET验证他们的用户使用电子邮件地址。因此,视图中可访问的唯一用户ID应传递给Controller,然后在db中搜索,以便用户获取电子邮件。
观点:
<div class="employee_list">
@foreach (var item in @Model.allUsers) {
<div class="employee_login" id="@Html.DisplayFor(modelItem => item.Pid)" data-id="@item.Pid" data-firstname="@item.FirstName" data-lastname="@item.LastName">
<p>@Html.DisplayFor(modelItem => item.FirstName) @Html.DisplayFor(modelItem => item.LastName) | Kennung: @Html.DisplayFor(modelItem => item.Pid)</p>
</div>
}
</div>
</div>
<div class="col-md-6 col-md-offset-3">
<h4>@ViewBag.Beschreibung2</h4>
<hr />
<section id="loginForm">
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form", role = "form" })) {
@Html.AntiForgeryToken()
@Html.HiddenFor(@Model => @Model.userid, new { @id = "idinput", value = "0" })
<div class="form-group">
@Html.LabelFor(m => m.Password, new {@class = "", @id = "kennwortlabel" })
@Html.PasswordFor(m => m.Password, new { @class = "form-control", @id = "password" })
@Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
</div>
<button type="submit" class="btn btn-default">Anmelden</button>
}
</section>
</div>
您必须创建一个隐藏的输入字段来获取用户ID。通过点击用户,这是通过jQuery完成的:
@section Scripts {
<script>
$(function () {
$('body').on('click', '.employee_login', function () {
$(this).siblings().removeClass('selected');
$(this).addClass('selected');
$('#idinput').val($(this).data('id'));
$('#password').prev('#kennwortlabel').text('Kennwort für ' + $(this).data('firstname') + " " + $(this).data('lastname'));
});
});
</script>
}
这是连接视图和Controller的viewmodel:
public class LoginViewModel {
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Speichern?")]
public bool RememberMe { get; set; }
[NonSerialized]
public List<ApplicationUser> allUsers;
[Required(ErrorMessage = "Please select your name")]
public int? userid { get; set; }
}
和控制器:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) {
model.allUsers = db.Users.ToList();
if (!ModelState.IsValid)
{
return View(model);
}
var user = db.Users.Where(i => i.Pid == model.userid).Single();
if (user != null) {
model.Email = user.Email;
}
else
return View(model);
....
}
因此,在模型中设置了用户标识,并通过单击提交按钮,执行上述功能。它从i.Pid == model.userid
的数据库中获取用户,并在模型中设置电子邮件地址,然后用于对用户进行身份验证。
我是C#的新手(尤其是使用EntityFramework),但也许有人觉得这很有帮助。
感谢我的支持者,
尼科