C#MVC - 将ViewModel对象从View传递给Controller

时间:2018-06-15 08:41:35

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

当我尝试将一个对象从我的View传递给我的HttpPOST方法时,我似乎遇到了困难。

单击我视图中的按钮后,代码会命中POST方法,但没有数据通过。我尝试更新方法参数并传递不同的值(如Ints),但无济于事。

这是我的HttpPOST方法:

    [HttpPost]
    public async Task<ActionResult> BookClass(MemberClassViewModel memberClassViewModel)
    {
        return RedirectToAction("Index");
    }

传入的参数似乎总是为NULL。

以下是我的View的代码。 Model是IEnumerable类型,即我的ViewModel对象列表,在我的例子中是3个对象。我想要实现的是,单击相应的按钮,将导致一个对象被传递回我的HttpPOST方法。我尝试过传递“价值”中的各种价值观&#39;参数。

@model IEnumerable<GymTracker.ViewModel.MemberClassViewModel>


@{
    ViewData["Title"] = "BookClass";
}

<h2>Book Class</h2>

@foreach (var item in Model)
{
    <form  method="post">    
        <div>    
            <hr />
            <dl class="dl-horizontal">    
                <dt>
                    @Html.DisplayNameFor(model => model.ClassName)    
                </dt>
                <dd>
                    @Html.DisplayFor(modelItem => item.ClassName)
                </dd>
                <dt>    
                    <button>Book Class</button>
                    <input type="hidden" asp-action="BookClass" asp-controller="Members" value="@item"/>    
                </dt>        
            </dl>
        </div>    
    </form>    
}

enter image description here 任何帮助将不胜感激,

由于

1 个答案:

答案 0 :(得分:2)

我已经重新编写了您的表单,因此您可以理解您需要name字段与您在控制器端的命名相关联。

如果您有MyModel.PropertyName模型对象,则它必须具有某种属性/属性。你现在用item做什么是你试图将MyModel存储在一个永远不会起作用的输入字段中。 MyModel需要一个属性,让我们称之为MyAttribute,它可以是与唯一书籍相关的名称(字符串)或id(int)。

@foreach (var item in Model)
{
    <form asp-action="BookClass" asp-controller="Members" method="post">
        <button type="submit">Book Class</button>
        <input type="hidden" name="MyModel.MyAttribute" value="@item.MyAttribute"/>      
    </form>  
}

编辑:

  

我明白你的意思,所以我想做的是,如果用户点击   在某个特定健身房类的某个按钮上,会被回发   我的方法。然后我做我的SQL写等(更新这个类说   +1会员已预订此内容。)

你能做的是:

@foreach (var gym in Model)
{
    <a asp-action="BookClass" asp-controller="Members" asp-route-id="@gym.Id">@gym.Name</a>
}

在你的控制器中:

[HttpGet([controller]/[action]/{id})]
public ActionResult BookClass(int id)
{
    //get the gym based on the id

    return RedirectToAction("Index");
}