如何将模型作为参数传递给 ASP.NET MVC 中的 [HttpPost] ActionMethod?

Posted

技术标签:

【中文标题】如何将模型作为参数传递给 ASP.NET MVC 中的 [HttpPost] ActionMethod?【英文标题】:How to pass model as a parameter to [HttpPost] ActionMethod in ASP.NET MVC? 【发布时间】:2022-01-09 10:13:24 【问题描述】:

我有一个普通的网格,它有编辑和保存按钮。当我从网格中单击Edit 链接时,它转到Edit 操作方法,我可以在其中读取Id 作为参数。我在想,既然我可以传递 ID,那么为什么不将整个模型作为参数传递给 Edit 操作呢?但是,我总是收到null。我查看了一些示例,它们都显示传递 id 而不是模型对象。我想知道为什么模型不能通过?即使在调试代码时,我总是看到项目行与项目中的参数Student 绑定。

使用编辑链接查看网格:

@model IEnumerable<MVC_BasicTutorials.Models.Student>

@
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";


<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.StudentName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Age)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) 
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.StudentName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Age)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new  id=item.StudentId, std=item ) |
     
        </td>
    </tr>


</table>

控制器动作方法:

// Get
public ActionResult Edit(int Id, Student std)

    var checkSet=std; // coming null
    var checkId=Id;  //i am seeing the id value

    return RedirectToAction("Index");

【问题讨论】:

【参考方案1】:

尝试以下方法:

public ActionResult Index()

    var model = /* prepare view data model */;
    return View(model);


[HttpPost]
// The second parameter `Id` is removed because of the `Student` already contains it.
public ActionResult Edit(Student std)

    System.Diagnostics.Debug.WriteLine($"Id= std.StudentId, Student Name= std.StudentName ");

    return RedirectToAction("Index");

Index.cshtml 中,您可以使用Html.BeginForm 辅助方法来指定表单的目标是“编辑”操作方法。

@model IEnumerable<MVC_BasicTutorials.Models.Student>

@
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";


<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.StudentName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Age)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    
        using (Html.BeginForm("Edit", "Home"))
        
            @* Prepare a hidden data context to the able the MVC data binding work correctly *@
            @Html.Hidden("StudentId", item.StudentId)
            @Html.Hidden("StudentName", item.StudentName)
            @Html.Hidden("Age", item.Age)

            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.StudentName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Age)
                </td>
                <td>
                    @*@Html.ActionLink("Edit", "Edit", new  id = item.StudentId, std = item ) *@
                    <input type="submit" value="Edit" />
                </td>
            </tr>
        
    
</table>

【讨论】:

以上是关于如何将模型作为参数传递给 ASP.NET MVC 中的 [HttpPost] ActionMethod?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 ASP.NET MVC 中的局部视图?

如何将多个参数传递给 ASP.NET CORE MVC 中的 HttpGet 方法?

如何将参数传递给 jQuery document.ready() 函数(ASP.NET MVC、C#)

ASP.Net MVC:使用 RedirectToAction() 将字符串参数传递给操作

ASP.NET MVC - 将参数传递给控制器

如何将多个参数传递给 ASP.NET Core 中的 get 方法