如何从多个模型向控制器传递“id”?

时间:2017-06-25 20:55:50

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

我正在尝试将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; }

    }
}

我的BasketController代码

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

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

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

1 个答案:

答案 0 :(得分:1)

您没有传递控制器方法,ID和数量所需的参数。在你的Html.BeginForm中添加id和quantity的值。

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