Данные, показывающие null в контроллере mvc при передаче через представление

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

Вот моя часть кода из View

@model IEnumerable<WeBOC.Support.Entities.Vessel>

@{
ViewBag.Title = "Vessels";
}

<h2>Vessels</h2>
@(Html.Kendo().Grid(Model)
    .Name("Grid")
.Columns(column =>
    {
        column.Bound(c => c.VIRNbr).Width(100).ClientTemplate(@Html.ActionLink("#=VIRNbr#", "VesselInspector", new { id = "#=VesselVisitId#" }).ToHtmlString()).Title("VIR No.").Width(150);
        column.Bound(c => c.VesselName).Width(150).Title("Vessel Name");
        column.Bound(c => c.InboundVoyageNbr).Width(70).Title("IB Vyg");
        column.Bound(c => c.OutboundVoyageNbr).Width(70).Title("OB Vyg");
        column.Bound(c => c.ETA).Width(100).Title("ETA").Format("{0:dd/MM/yyyy HH:mm}");
        column.Bound(c => c.ArrivalDate).Width(100).Title("ATA").Format("{0:dd/MM/yyyy HH:mm}");
    })
    .Groupable()
    .Sortable()
    .Pageable()
    .Filterable()
    .DataSource(datasource => datasource
        .Ajax()
        .ServerOperation(true)
        .PageSize(20)
        .Read(read => read
            .Action("Vessels_Read", "VesselVisit", new { id = "\\#=State\\#"})
            ))
)

И это метод контроллера

public ActionResult Vessels_Read([DataSourceRequest] DataSourceRequest request, string id)
    {
        return Json(GetVessels(id).ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
    }

Почему я получаю значение null в идентификаторе параметра, несмотря на то, что он передается через представление.

public ActionResult Vessels(string id)
    {
        return View(GetVessels(id));
    }

    public IEnumerable<Vessel> GetVessels(string phase)
    {
        IEnumerable<Vessel> vsl = null;
        vsl = this._repository.GetVesselByPhase(phase);            
        return vsl;
    }

Любая помощь будет оценена.

Спасибо, Овайс.


person Muhammad Ovais    schedule 26.09.2013    source источник
comment
State является членом Vessel? Добавьте точку останова на vsl = this._repository.GetVesselByPhase(phase); и проверьте, считывается ли это значение из репозитория при первом доступе к вашему представлению.   -  person Alex Costa    schedule 27.09.2013
comment
Да, государство является членом Vessel. Я уже проверил значение, поставив точку останова. При первом доступе я получаю правильное значение, но во время подкачки сетки я получаю нулевое значение.   -  person Muhammad Ovais    schedule 30.09.2013


Ответы (1)


Если вы хотите передать дополнительные параметры своему действию, вы должны сделать что-то вроде этого:

.DataSource( dataSource => dataSource
    .Ajax()
    .Read( "Vessels_Read", "VesselVisit" ).Data("getState") //getState is a javascript function
)

Затем добавьте блок сценария:

<script>
function getState() {
    return {
        ID: // your ID, obtained with jQuery, from the View Model, hardcoded, etc...
    };
}
</script>

Дополнительная информация здесь.

ИЗМЕНИТЬ

У меня это работает прямо сейчас. Я работаю с моделью просмотра, но она не должна отличаться.

Вид:

.DataSource( dataSource => dataSource
    .Ajax()
    .Read( "MY_ACTION", "MY_CONTROLLER", new { Id = Model.Id } )
)

Контроллер:

[HttpPost]
public ActionResult MY_ACTION( [DataSourceRequest] DataSourceRequest request, long Id )

Даже если я изменю new { Id = Model.Id } на new { Id = "QWERTY" } и параметр действия на строку, я получу "QUERTY" в качестве значения.

person Alex Costa    schedule 26.09.2013
comment
@user2542561 user2542561 каково значение #=State# ? где вы берете его значение? - person Alex Costa; 26.09.2013
comment
Это строковый тип, его значение ЗАКРЫТО. Я также пробовал жестко закодированную строку CLOSED в функции javascript, но бесполезно.. :( - person Muhammad Ovais; 26.09.2013
comment
Должен ли я писать значения маршрута?? - person Muhammad Ovais; 26.09.2013
comment
@user2542561 user2542561 В вашей функции javascript return { id: $("#State").val }; val должно быть return { id: $("#State").val() };. В любом случае, проверьте мой отредактированный ответ, чтобы узнать, поможет ли он. - person Alex Costa; 26.09.2013
comment
Ваш отредактированный ответ работает хорошо, но моя модель имеет тип IEnumerable, и я не могу получить доступ к свойствам модели, т.е. Model.Id и т. д. Поскольку я использую сетку кендо и хочу получить значение поля State. Я также пробовал <script> function getstate() { return { phase: $("#State").val() }; } </script>, но все еще получаю значение null в параметре контроллера. - person Muhammad Ovais; 27.09.2013
comment
Также попробовал .Read(read => read .Action("Vessels_Read", "VesselVisit", new { phase = "#=State#"}), но получил нуль. Интересно, что я получаю правильное значение VesselVisitId в этом коде column.Bound(c => c.VIRNbr).Width(100).ClientTemplate(@Html.ActionLink("#=VIRNbr#", "VesselInspector", new { id = "#=VesselVisitId#" }).ToHtmlString()).Title("VIR No.").Width(150); - person Muhammad Ovais; 27.09.2013
comment
Кроме того, я заметил, что это поведение предназначено только для ServerOperation(True). Когда я использую False, все работает нормально. - person Muhammad Ovais; 27.09.2013
comment
@user2542561 user2542561 У меня заканчиваются идеи... Попробуйте это .Action("Vessels_Read", "VesselVisit", new { id = "\\#=State#\\"}) в своем Read действии (исключая параметр State) kendoui.com/forums/kendo-ui-web/grid/ - person Alex Costa; 27.09.2013
comment
Получение только \\ в параметре.. :( - person Muhammad Ovais; 27.09.2013
comment
@user2542561 user2542561 Пожалуйста, отредактируйте свой вопрос и добавьте весь код Grid плюс элемент со значением State. - person Alex Costa; 27.09.2013
comment
Я отредактировал свой вопрос, см. объяснение еще раз вверху. - person Muhammad Ovais; 27.09.2013