【问题标题】:Why my controller cannot get the model passed back from view?为什么我的控制器无法从视图中传回模型?
【发布时间】:2013-11-12 05:08:24
【问题描述】:

我的控制器无法获取从控制器传回的模型。我花了整个上午都想不通,如果有人可以帮助我,请拨出它。谢谢!!!

补充:我有点效仿这个例子,它只有表单标签而不是ajax表单

MVC4 Passing model from view to controller

型号 这是一个产品实体列表,我正在使用 .net 实体框架进行数据库访问

public class VM_Products
{
    public List<FMST_Product> Products { get; set; }
}

控制器

private FMSTEntities ctx = new FMSTEntities();

public ActionResult Index()
{
  VM_Products vmps = new VM_Products();

  vmps.Products = ctx.FMST_Product.ToList();

  return View("Index", vmps);
}

// when I step in, the SelectedProducts is always null ???
public ActionResult AddToCart(FMST_Product SelectedProducts)  
{
        return View();
}

查看

@using FMST
@using FMST.Models
@model VM_Products

<ul id="products" class="list clear">           
            @foreach (var p in Model.Products)
            {
                <form action="POST" id=@p.ProductID>
                    <li class="clearfix">
                    @p.ProductID
                    <br>
                    @p.ProductName
                    <br>
                    @p.ProductDesc
                    <br>
                            @p.ProductPrice
                            <span class="darkview">
            @Html.ActionLink("Add To CT","AddToCart","Product",p);

                            </span>
                    </li>

            </form>   
            }
</ul>

【问题讨论】:

  • 其中一个问题(我认为不止 1 个)是您正在使用 @Html.ActionLink 并希望它像 POST 一样工作,但 ActionLink 创建了一个 &lt;a&gt; 标签所以只有GET,如果你想POST,你需要使用表单或AJAX。
  • 如果您将页面放在表单标签中并使用提交按钮,模型将自动传回正如其他人所说,如果您希望模型在没有回发的情况下返回,您将需要进行 ajax 调用并在 jquery 中构建模型
  • 如果您看一下您正在遵循的示例,他实际上并没有发布任何内容,ActionLink 只是参数化对象(在您的情况下为product)并将其传递给控制器作为QueryString 的一部分的操作。
  • 我可以通过将 ActionLink 更改为 @Html.ActionLink("Add to cart", "AddToCart", "Product", new { productid = p.ProductID }, ""),传递整个产品对象并将其放入控制器中仍然没有运气

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

从以下位置更改您的 html 助手:

@Html.ActionLink("Add To CT","AddToCart","Product",p);

到:

@Html.ActionLink("Add To CT","AddToCart","Product",p,null);

由于您在 html 帮助程序中指定 ControllerName,因此您需要通过将 null 作为最后一个参数传递来强制帮助程序使用正确的重载。

【讨论】:

  • 是的,我刚刚想通了,我可以这样做 @Html.ActionLink("Add To CT","AddToCart",p);这将转到同一个控制器或 @Html.ActionLink("Add To CT","AddToCart","Product",p,null);可用于 GET 到另一个控制器。感谢 SOfanatic !!!
  • @user2418709 好酷,因为它有助于不要忘记将其标记为答案。
  • 对不起,我可以在哪里将其标记为答案?我没有看到按钮或链接,这是我第一次在这里提问。谢谢。
  • @user2418709 by 0 带有向上和向下箭头,有一个复选标记,您必须单击它。
【解决方案2】:

看起来您的 AddToCart 操作需要一个产品列表,但您传入的是一个产品。

可以在一个步骤中将多个产品添加到购物车吗?希望这能为您指明正确的方向。

【讨论】:

  • 谢谢,我刚刚更改了代码,但仍然没有运气。 public ActionResult AddToCart(FMST_Product products) { return View(); }
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多