将模型从视图传递到控制器(MVC)

时间:2015-10-21 16:52:39

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

将模型从我的视图传递给控制器​​时,数据全部为空。我能够使用ActionLink成功传递它,但我不认为这是最好的方式;出于安全原因(我不想在查询字符串中使用敏感数据)。

我的模特

public class DashboardModel
{
    // Dasboard quick numbers
    public int TotalUsers { get; set; }
    public int TotalUnauthUsers { get; set; }
    public int GamesPlayed { get; set; }
    public int AssociatedGroups { get; set; }
    public int TotalGroups { get; set; }

    // Dashboard table
    public IEnumerable<ManageUserData> UnauthUsers { get; set; }

}

public class ManageUserData
{
    public string UserName { get; set; }
    public int AlternateId { get; set; }
    public string Email { get; set; }
    public string Role { get; set; }
    public IEnumerable<string> InvestigatorGroups { get; set; }
    public string Institution { get; set; }

    // User status
    public bool AccountLocked { get; set; }
    public bool EmailConfirmed { get; set; }
}

我的观点片段

@model TestGame.ViewModels.DashboardModel

@foreach (var user in Model.UnauthUsers)
{
    <tr>
        <td>@user.UserName</td>
        <td>@user.AlternateId</td>
        <td>@user.Email</td>
        <td>@user.Role</td>
        <td>
            @if (!user.EmailConfirmed)
            {
                <div class="text-warning">Unconfirmed Email</div>
            }
            @if (user.AccountLocked)
            {
                <div class="text-danger">Account Locked</div>
            }

        </td>
        <td>

            @if (user.AccountLocked || !user.EmailConfirmed)
            {

                using (Html.BeginForm("Manage", "Admin", FormMethod.Post))
                {
                    @Html.HiddenFor(x => user.UserName)
                    @Html.HiddenFor(x => user.Email)

                    <input type="submit" value="Manage" />

1 个答案:

答案 0 :(得分:1)

您必须确保路径以要回发的对象开始;如果发布到(HttpPost管理/管理操作)的操作采用User类型的对象,那么您所拥有的将会很有效;如果需要模型类型的对象,请将表单更改为以下内容:

for (var i = 0; i < Model.UnAuthUsers.Count; i++)

 using (Html.BeginForm("Manage", "Admin", FormMethod.Post))
                {
                    @Html.HiddenFor(x => x.UnAuthUsers[i].UserName)
                    @Html.HiddenFor(x => x.UnAuthUsers[i].Email)

                    <input type="submit" value="Manage" />

从模型中创建一个引用(是x)就可以了。

编辑:根据评论,为您的模型添加两个属性:

public class DashboardModel
{
   public string SelectedUserName { get; set; }
   public string SelectedEmail { get; set; }
}

在您的表单中,为该名称渲染一个隐藏的内容;我使用HiddenFor时遇到了麻烦,所以我过去直接使用了隐藏的内容:

using (Html.BeginForm("Manage", "Admin", FormMethod.Post))
{
   <input type="hidden" name="@Html.NameFor(i => i.SelectedUserName)" value="@Model.UnauthUsers[i].UserName" />
   <input type="hidden" name="@Html.NameFor(i => i.SelectedEmail)" .. />

在提交表单后,该表单中的用户将通过这些新属性通过模型回发。