Asp MVC 4 HiddenFor передает null в метод

ASP.NET
  1. 3 года назад
    Добавлено 3 года назад Alexandr_Erohin

    Asp MVC 4 HiddenFor передает null в метод

    Такую ошибку выдает:
    Ошибка сервера в приложении '/'.

    Словарь параметров содержит запись со значением NULL для параметра "bookId" типа "System.Int32", не допускающего значение NULL, для метода "System.Web.Mvc.RedirectToRouteResult AddToCart(BookStore.Domain.Entities.Cart, Int32, System.String)" в "BookStore.Controllers.CartController". Необязательный параметр должен иметь ссылочный тип, тип, допускающий значение NULL, либо он должен быть объявлен как необязательный параметр.
    Имя параметра: parameters

    Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

    Сведения об исключении: System.ArgumentException: Словарь параметров содержит запись со значением NULL для параметра "bookId" типа "System.Int32", не допускающего значение NULL, для метода "System.Web.Mvc.RedirectToRouteResult AddToCart(BookStore.Domain.Entities.Cart, Int32, System.String)" в "BookStore.Controllers.CartController". Необязательный параметр должен иметь ссылочный тип, тип, допускающий значение NULL, либо он должен быть объявлен как необязательный параметр.
    Имя параметра: parameters

    Ошибка источника:

    Необработанное исключение при выполнении текущего веб-запроса. Информацию о происхождении и месте возникновения исключения можно получить, используя следующую трассировку стека исключений.

    Трассировка стека:

    [ArgumentException: Словарь параметров содержит запись со значением NULL для параметра "bookId" типа "System.Int32", не допускающего значение NULL, для метода "System.Web.Mvc.RedirectToRouteResult AddToCart(BookStore.Domain.Entities.Cart, Int32, System.String)" в "BookStore.Controllers.CartController". Необязательный параметр должен иметь ссылочный тип, тип, допускающий значение NULL, либо он должен быть объявлен как необязательный параметр.
    Имя параметра: parameters]
    System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo) +608331
    System.Web.Mvc.<>c__DisplayClass1.<Execute>b__0(ParameterInfo parameterInfo) +18
    System.Linq.WhereSelectArrayIterator`2.MoveNext() +66
    System.Linq.Buffer`1..ctor(IEnumerable`1 source) +239
    System.Linq.Enumerable.ToArray(IEnumerable`1 source) +77
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +135
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
    System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +48
    System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +57
    System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
    System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +48
    System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
    System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651188
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

    Вот такое представление имеется:
    Никита Бурлаков BookStore.Domain.Entities.Book

    <div class="well">
    <h3>
    <strong>@Model.Name</strong>
    <span class="pull-right label label-primary">@Model.Price.ToString("# руб")</span>
    </h3>
    
    Html.BeginForm("AddToCart", "Cart")
    {
    <div class="pull-right">
    @Html.HiddenFor(x => x.Id, new {Name = "id"}) 
    @Html.Hidden("resultUrl", Request.Url.PathAndQuery)
    
    <input class="btn btn-success" type="submit" value="Добавить в корзину"/>
    
    </div>
    }
    <span class="lead">@Model.Description</span>
    </div>
    
    А вот такой Controller:
    
    namespace BookStore.Controllers
    {
    public class CartController : Controller
    {
    public ViewResult Index(string returnUrl)
    {
    return View(new CartIndexViewModel
    {
    Cart = GetCart(),
    ReturnUrl = returnUrl
    });
    }
    
    private IBookRepository repository;
    
    public CartController(IBookRepository repo)
    {
    repository = repo;
    }
    
    public RedirectToRouteResult AddToCart(int? bookId, string returnUrl)
    {
    Book book = repository.Books
    .FirstOrDefault(b => b.Id == bookId);
    
    if (book != null)
    {
    GetCart().AddItem(book, 1);
    }
    return RedirectToAction("Index", new { returnUrl });
    }
    
    public RedirectToRouteResult RemoveFromCart(int bookId, string returnUrl)
    {
    Book book = repository.Books
    .FirstOrDefault(b => b.Id == bookId);
    
    if (book != null)
    {
    GetCart().RemoveLine(book);
    }
    return RedirectToAction("Index", new { returnUrl });
    }
    
    public Cart GetCart()
    {
    Cart cart = (Cart)Session["Cart"];
    if (cart == null)
    {
    cart = new Cart();
    Session["Cart"] = cart;
    }
    return cart;
    }
    }
    }

или зарегистрируйтесь чтобы ответить