【问题标题】:C# MVC - Passing ViewModel object from View to ControllerC# MVC - 将 ViewModel 对象从视图传递到控制器
【发布时间】:2018-11-25 02:03:49
【问题描述】:

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

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

这是我的 HttpPOST 方法:

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

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

这是我的视图的代码。模型是 IEnumerable 类型,即我的 ViewModel 对象的列表,在我的例子中是 3 个对象。我想要实现的是,单击相应的按钮,将导致一个对象被传递回我的 HttpPOST 方法。我尝试在“value”参数中传递各种值。

@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>    
}

任何帮助将不胜感激,

谢谢

【问题讨论】:

  • 使用&lt;input type="submit" /&gt; 提交表单数据。
  • 你应该使用foreach,因为你已经绑定了一个模型列表来查看
  • 我已经修改了输入类型并删除了按钮。但是,仍然没有值被传递回我的 HttpPOST 方法。我已经按照上面的链接访问了另一个问题,但无济于事,
  • 你没有生成任何表单控件,所以没有什么可以提交

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


【解决方案1】:

我已将您的表单重新编写得更加简洁,因此您可以理解您需要 name 字段来与您在控制器端的命名相关。

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

@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");
}

【讨论】:

  • 谢谢,所以你的意思是我不能将整个对象发送回控制器?拥有它的所有属性?我将尝试仅返回一个属性来尝试您的建议
  • @Metzer 不,你不能在输入字段中存储整个对象,你需要单独存储它的属性。
  • 好的,谢谢你的帮助,我会玩一玩的。
  • 我猜有没有办法存储多个属性?比如说我的对象有 3 个属性,如果没有办法传回整个对象,我想传回 3 个单独的属性。这可能吗
  • @Metzer 取决于您可以尝试将它们存储在单个字符串中并用“|”分隔的属性类型例如,并在控制器中有逻辑将其分开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多