ASP.NET MVC 5 — значение модели передается неправильно

#c# #javascript #asp.net-mvc #kendo-ui #asp.net-mvc-5

#c# #javascript #asp.net-mvc #kendo-пользовательский интерфейс #asp.net-mvc-5

Вопрос:

Я разрабатываю веб-приложение на MVC 5, также используя веб-API с сеткой пользовательского интерфейса Kendo для отображения данных. При загрузке сетки данных автомобиля она основана на идентификаторе клиента, который будет установлен для модели.

Разметка для сетки пользовательского интерфейса Kendo находится в Partial_View.

Итак, в моем контроллере MVC у меня есть что-то вроде приведенного ниже:

 model.CustId = "12345"; //just hard coded - will possibly come from query string or set somewhere else
return PartialView(_CarDetails, model);
 

В моем частичном представлении _CarDetails код сетки Kendo выглядит следующим образом. Я также установил @Html.HiddenFor в частичном представлении для CustID

 @Html.HiddenFor(model => model.CustId)

                    //other setting up off Kendo UI Grid removed for Brevity
                      .DataSource(dataSource => dataSource
                          .Ajax()
                         .Read(read => read.Url("api/Car/GetDetails").Type(HttpVerbs.Get).Data("GetCustId"))
                      )
                      )
            </div>
 

Итак, на странице, которая загружает частичное представление в моем документе.Готово, у меня есть функция js, которая GetCustId — это как показано ниже:

     function GetCustId() {
        alert('@Model.CustId');
        return { custId: '@Model.CustId' };
    }
 

оповещение возвращает пустое значение, а затем, если я установлю точку останова в своем методе getDetails в контроллере webapi, поле CustID равно нулю — если я жестко закодирую это для некоторого значения в моей функции js, оно будет передано нормально, но есть ли что-то неправильное в том, как я подключил его для получения значения из модели?

Обновить

Сигнатура метода веб-API выглядит следующим образом:

    public DataSourceResult GetDetails([ModelBinder(typeof(ModelBinders.DataSourceRequestModelBinder))] DataSourceRequest request, string custId)
        {
            //this is another method in web api controller that calls services to get details and then maps the responses to View Model
            return GetCarDetailsByCustId(custId).ToDataSourceResult(request);
        }
 

Обратите внимание, что я также обновил файл WebApiConfig.cs, добавив {action} в путь, как показано ниже:

       config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
 

Комментарии:

1. Какова сигнатура действия в вашем контроллере для этого?

2. @DavidShorthose — обновил вопрос, чтобы включить это

3. Опубликуйте разметку, в которой вы добавляете частичный вид в свой основной вид

4. Что произойдет, если вы получите доступ к скрытому значению через jquery, вместо того, чтобы устанавливать значение из модели? Например, $(«#CustID»).val() в вашем скрипте

5. Обычно я бы устанавливал значения именно так. Рад, что теперь у вас все работает.

Ответ №1:

Не уверен, зачем вам нужно скрытое поле или js, когда модель уже привязана к представлению. Вы должны быть в состоянии просто:

 .Read(read => read.Url("api/Car/GetDetails").Type(HttpVerbs.Get).Data((string)model.CustId ))