将值从视图传递到c#ASP.NET

时间:2016-06-09 05:01:07

标签: c# asp.net asp.net-mvc razor

认为这可能是一个简单的问题,但我无法弄清楚如何在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:

Render-View from Browser.

我读到通过viewmodel将视图中的值传递给Controller是一种很好的做法,这正是MVVM-Architecture所展示和想要的。如果通常通过http或其他方式来做,请告诉我。

请原谅我这是一个简单的问题,几分钟后就解决了。

谢谢你,祝你有愉快的一天,

尼科

2 个答案:

答案 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),但也许有人觉得这很有帮助。

感谢我的支持者,

尼科

相关问题