【问题标题】:How to pass an "id" to controller from multiple models?如何将“id”从多个模型传递给控制器​​?
【发布时间】:2017-06-25 20:55:50
【问题描述】:

我正在尝试将 id 传递给我的购物篮,但我不断收到错误消息

参数字典包含参数“id”的空条目 方法的不可空类型“System.Int32” 'System.Web.Mvc.ActionResult AddToBasket(Int32, Int32)' 在 'UberUnlock.Controllers.BasketController'。可选参数必须 是引用类型、可为空的类型或被声明为可选项 范围。参数名称:参数

我不知道出了什么问题,当我只引用一个模型时,我的代码工作正常

@model UberUnlock.Product

在视图顶部,但每当我尝试通过 ModelView 添加两个模型时

@model UberUnlock.ViewModel.MultipleModelInOneView

我不断收到上述错误,谢谢。

这是我的查看代码

@model UberUnlock.ViewModel.MultipleModelInOneView


                    <dd>
                        @using (Html.BeginForm("AddToBasket", "Basket"))
                        {
                            @Html.AntiForgeryToken()
                            @Html.HiddenFor(model => model.Products.ID)

                            @Html.DropDownList("quantity", Enumerable.Range(1, 10).Select(i => new SelectListItem { Text = i.ToString(), Value = i.ToString() }))
                            <input type="submit" class="btn btn-primary btn-default margin" value="Add to Basket">
                        }
                    </dd>

<p>

    @Html.ActionLink("Edit", "Edit", new { id = Model.Products.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

这是我的 ViewModel 代码

using UberUnlock.Models;


namespace UberUnlock.ViewModel
{
    public class MultipleModelInOneView
    {
        public Order Orders { get; set; }
        public Product Products { get; set; }

    }
}

我的篮子控制器代码

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddToBasket(int id, int quantity)
    {
        Basket basket = Basket.GetBasket();
        basket.AddToBasket(id, quantity);
        return RedirectToAction("Index");
    }

这是一个 ProductController(这是我的视图的控制器)

public ActionResult Details(int? id)
        {

            var model = new MultipleModelInOneView();

            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            model.Products = db.Products.Find(id);
            if (model.Products == null)
            {
                return HttpNotFound();
            }
            return View(model);
        }

【问题讨论】:

  • 在尝试访问MultipleModelnOneView.Product.ID 之前,您是否将MultipleModelnOneView.Product 初始化为实例?
  • 您没有将值 id 和数量传递给控制器​​
  • 我已经添加了我的视图控制器。这是我必须初始化 MultipleModelInOneView 的地方吗
  • 你仍然没有传递 id。检查我在视图代码中传递 Id 和数量的 Html.BeginForm 代码。\

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

您没有将所需的参数传递给控制器​​方法、id 和数量。在您的 Html.BeginForm 中添加 id 和数量的值。

@model UberUnlock.ViewModel.MultipleModelInOneView


                <dd>
                    @using (Html.BeginForm("AddToBasket", "Basket", new { id = Model.Products.ID,quantity = quantityvalue }))
                    {
                        @Html.AntiForgeryToken()
                        @Html.HiddenFor(model => model.Products.ID)

                        @Html.DropDownList("quantity", Enumerable.Range(1, 10).Select(i => new SelectListItem { Text = i.ToString(), Value = i.ToString() }))
                        <input type="submit" class="btn btn-primary btn-default margin" value="Add to Basket">
                    }
                </dd>

<p>

@Html.ActionLink("Edit", "Edit", new { id = Model.Products.ID }) |
@Html.ActionLink("Back to List", "Index")
</p>  

或者,如果您不想一直传递任何值,您可以使控制器中的参数为空。或者正如 Rahul 所指出的,您可以将它们设置为 0。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddToBasket(int? id, int? quantity)
{
    Basket basket = Basket.GetBasket();
    basket.AddToBasket(id, quantity);
    return RedirectToAction("Index");
}

或者另一种方式是去掉参数id和数量,传递给视图模型。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddToBasket(MultipleModelInOneView model)
{
    Basket basket = Basket.GetBasket();
    basket.AddToBasket(model.Product.ID, model.Product.quantity);
    return RedirectToAction("Index");
}

【讨论】:

  • 为什么要让 qty 参数为空?只需设置一个初始值,如 public ActionResult AddToBasket(int id , int qty =0)\
  • 谢谢@The_Outsider 这行代码对我有用{ id = Model.Products.ID }
  • @da_funk 如果它对你有用,请将我的答案标记为正确答案。谢谢。
  • @da_funk 答案很简单,您的模型包含许多属性,因此每当您传递任何单个属性(例如 ID)时,模型对象都会自动初始化,其他值设置为该特定类型的最小值int of qty 将设置为 0,因此模型有效
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多