将一个项目从模型集合发布到MVC中的控制器方法

时间:2016-05-27 10:55:47

标签: c# asp.net-mvc

我有一个视图,其中显示用户列表,将模型设置为:

@model List<MyProject.Models.User>

在此视图中,我希望能够选择对特定用户执行操作,即发布到我要禁用用户的控制器。如何将特定用户对象发布到控制器?

这是我迄今为止所做的,但我无法看到如何从集合中发布特定对象:

@foreach (var c in Model)
{
    <tr>
        <td>@c.Username</td>
        <td>@c.IsEnabled</td>
        <td>
            @using (Html.BeginForm("DisableUser", "UserManagement"))
            {
                <input type="submit" value="Disable" class="btn btn-primary"/>
            }
        </td>
    </tr>
}

我的控制器有签名:

public ActionResult DisableUser(User user)

4 个答案:

答案 0 :(得分:2)

您可以在User方法中添加路由值,以便回发ID或用户BeginForm() UserId`,然后,而不是回发. Assuming that property is named的所有内容。 p>

@foreach (var c in Model)
{
    <tr>
        ....
        <td>
            @using (Html.BeginForm("DisableUser", "UserManagement", new { id = c.UserId ))
            {
                <input type="submit" value="Disable" class="btn btn-primary"/>
            }
        </td>
    </tr>
}

并且控制器方法将是

public ActionResult DisableUser(int id)
{
    // Get the User based on id, update it and redirect
}

您还可以考虑使用ajax提交值,以便用户可以停留在同一页面上并继续“停用”&#39;其他User个对象无需进行重定向,在这种情况下代码可能是

@foreach (var c in Model)
{
    <tr>
        ....
        <td>
            <button type="button" class="disable" data-id="@c.UserId">Disable</button>
        </td>
    </tr>
}

var url = '@Url.Action("DisableUser", "UserManagement")';
$('.disable').click(function() {
    var row = $(this).closest('tr');
    $.post(url, { id: $(this).data('id') }, function(result) {
        if(result) {
            // for example, remove the row from the table
            row.remove();
        } else {
            // Oops
        }
    }).fail(function (result) {
        // Oops
    });
});

并且控制器方法将是

public JsonResult DisableUser(int id)
{
    // Get the User based on id and update it
    return Json(true);
    // or if the update failed - return Json(null);
}

答案 1 :(得分:0)

禁用用户的简单方法是使用Html.ActionLink而不是表单 - 您应该能够在模板代码中看到大量示例。操作链接可以重定向到确认页面,或者您可以禁用该用户并重定向到消息页面,说明&#34;用户已被禁用&#34;。

我更好的方法是使用AJAX。您可以使用jQuery执行此操作,也可以使用MVC Ajax formAjax Action Link。我建议您使用谷歌MVC Ajax Action Link示例。

您可能还希望通过将其设置为Bootstrap 'btn' class来为该链接设置样式。

答案 2 :(得分:0)

有一种方法可以发布单个用户

@foreach (var c in Model)
{
<tr>
    <td>@c.Username</td>
    <td>@c.IsEnabled</td>
    <td>
        @using (Html.BeginForm("DisableUser", "UserManagement"))
        {
           <input type="text" name="Username" value="@c.Username">
            <input type="text" name="IsEnabled" value="@c.IsEnabled">
            <input type="hidden" name="id" value="@c.id">

            <input type="submit" value="Disable" class="btn btn-primary"/>
        }
    </td>
</tr>
}

这些想法是一样的,由于时间不够,请按照您的要求进行,使用Class Property名称作为输入名称,动作将获得值

答案 3 :(得分:-1)

首先,你不得在任何循环中声明Html.BeginForm以将对象发布到控制器。

@using (Html.BeginForm("DisableUser", "UserManagement"))
{
    @foreach (var c in Model)
    {
        <tr>
            <td>@c.Username</td>
            <td>@c.IsEnabled</td>
            <td>           
                <input data-id="@c.Id" type="submit" value="Disable" class="clsBtnPost btn btn-primary"/>           
            </td>
        </tr>
    }
}

这是供您参考

$(document).ready(function(){
   $(".clsBtnPost").click(function(){
        var userId = $(this).data("id");
        $.ajax({
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: 'POST',
        url: 'ControllName/MethodName', //Your Url
        data: { 'userId': userId },
        success: function () {          
           alert("successfully called.");
        },
        failure: function (response) {          
           alert("Error");
        }
      }); 
   });
});

您可以使用 Ajax 调用将单个对象传递给控制器​​。