【问题标题】:MVC3 - Null values posting to actionMVC3 - 发布到操作的空值
【发布时间】:2012-07-09 16:07:43
【问题描述】:

我在 Windows 2008 R2 服务器 (IIS 7.5) 上运行几个经典的 ASP 网站,并添加了一个简单的 MVC3 电子商务网站。问题是当我尝试使用表单从产品页面将商品添加到购物车时。使用 Razor 语法,我有以下代码:

@using (Html.BeginForm("Add", "Cart", FormMethod.Post, new { }))
{
    @Html.HiddenFor(m => m.Id)
    @Html.TextBoxFor(m => m.Quantity, new { size = "1" })
    <input type="submit"  value="Add to Cart"/>
}

public class AddToCartViewModel
{
    public string Id { get; set; }
    public int Quantity { get; set; }
}

[HttpPost]
public ActionResult Add(AddToCartViewModel cartItem)
{
    // Code that adds the item to the cart

    // Go back to the product page
    return RedirectToAction("Model", "Product", new { id = cartItem.Id });
}

问题在于 ModelId 和 Quantity 没有填充表单中的数据。 cartItem 不为 null,并且正在调用此操作。此代码在通过 Visual Studio 2010 运行时完美运行,所以我猜测它是服务器和/或 IIS 配置设置。奇怪的是,我还有另一个购物车页面,允许用户更新购物车中的商品数量,效果非常好。该页面更复杂,因为它使用视图模型中的列表,所以我看不出为什么我的简单请求会失败。

使用 ActionLink(带有硬编码数量)而不是表单有效。

@Html.ActionLink("Add to cart", "Add", "Cart", new { Id = Model.Id, Quantity = 1}, new {})

我尝试将 action 方法的签名更改为采用 string 和 int,但由于数量为空而引发异常。

抓住最后一根稻草,我运行了以下命令以确保 .NET 4.0 已注册,而且看起来还不错。我有 2.0.50727.0,以及 4.0.30319.0 的 x32 和 x64 版本

按照 Phil Haack's instructions 部署应用程序的 Bin 也不起作用

我没有想法,因为在 Visual Studio 中一切正常,我找不到其他有同样问题的帖子。我只是缺少一些简单的东西吗?另外,我刚刚注意到通过帐户控制器登录在服务器上也不起作用。没有显示错误或验证问题。我正在使用默认的成员资格提供程序,但 web.config 配置为使用我自己的数据库。连接有效,因为我可以注册一个新用户,并且该新用户已登录成功注册。

【问题讨论】:

  • @OmerAmsel 是的,它已声明并填充。表单在页面上具有正确的值。该表单位于以AddToCartViewModel 为模型的强类型部分视图中。我发布的是部分视图,仅减去模型声明。
  • 调试 action 方法并检查请求,以确保您的值在实际 Post 中,并且它们与模型中的属性具有完全相同的名称。

标签: asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

[编辑]

好的,现在你已经更新了你的问题,更新了答案。我认为问题很可能归结为您没有在初始获取 Add 操作的请求中初始化模型。尝试添加HttpGetHttpPost,如下所示:

[HttpGet]
public ActionResult Add()
{
    var viewModel = new AddToCartViewModel() 
    {
        Id = "myid", 
        Quantity = 0
    };
    return View(viewModel);
}

[HttpPost]
public ActionResult Add(AddToCartViewModel cartItem)
{
    // Code that adds the item to the cart

    // Go back to the product page
    return RedirectToAction("Model", "Product", new { id = cartItem.Id });
}

我相信这现在可以工作了。

【讨论】:

  • 感谢您指出这一点。不幸的是,这是一个复制/粘贴错误,因为 AddToCartViewModel 没有 ModelId。经过仔细检查,我的原始代码确实使用了 cartItem.Id。我在帖子中更正了这一点并添加了 [HttpPost] 属性。
  • tehrustine - 更新了我的答案以反映您最近的更改。相信这对你有用。 :-0
  • 这就是它应该如何工作的方式,并且在通过 Visual Studio 2010 运行时它可以完美地运行。但是,我的问题是它在部署在服务器上时不起作用。
【解决方案2】:

使用强类型的 html 帮助器

@Html.HiddenFor(m => m.Id)     
@Html.TextBoxFor(m => m.Quantity, new { size = "1" }) 

并确保您已使用[HttpPost]. 标记该操作

【讨论】:

  • 我在我的代码中更改了这一点,并将更新帖子以匹配,但我仍然得到相同的结果。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多