Привет Я использую следующий код для перенаправления из кендо сетки на другую страницу (View):ASP.NET MVC: Перенаправление от одного вида к другому
@(Html.Kendo().Grid<WM.ViewModels.StockReceiptsGridViewModel>()
.Name("Grid")
.ToolBar(toolbar => toolbar.Template("<a class='k-button k-button-icontext' onclick='addMaterialPopup()' href='#'></span>Create Stock Receipt</a>"))
.Columns(columns =>
{
columns.Bound(p => p.StockReceiptID);
columns.Bound(p => p.SupplierName);
columns.Bound(p => p.Product);
columns.Bound(p => p.Dimensions);
columns.Bound(p => p.Quantity);
columns.Bound(p => p.QuantityReserved);
columns.Bound(p => p.PurchaseNumber);
columns.Bound(p => p.Cost);
columns.Bound(p => p.PhotosLink).Title("").ClientTemplate("<a href='/Photos/index?StockReceiptID=#=StockReceiptID#'>#=GetText()#</a>");
columns.Command(command => command.Custom("Edit").Click("editreceipt"));
})
.DataSource(dataSource => dataSource
.Ajax()
.Batch(false)
.Model(model => model.Id(p => p.StockReceiptID))
.Read(read => read.Action("Read", "StockReceiptsGrid").Data("ExtraData"))
)
)
Javascript:
function editreceipt(e) {
e.preventDefault();
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
var stockReceiptId = dataItem.StockReceiptID;
window.location.href = "@Url.Action("Update","StockReceipt")"+"/"+stockReceiptId; // Problem code...
}
метод приема на контроллере StockReceipt является:
public ActionResult Update(int stockReceiptId)
{
var stockReceipt = _stockReceiptRepository.GetAllStockReceipts().ToList().Where(r => r.StockReceiptID == stockReceiptId);
var model = new StockReceiptViewModel();
model.Notes = stockReceipt.First().Notes;
return View("Index", model);
}
И вот моя конфигурация маршрута:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Проблема:
.. является то, что выше Javascript код не перенаправлять, он берет меня на этот URL: HTTP: //localhost:50439/StockReceipt/6
и отчетность «Желтый экран смерти» с этой ошибкой:
Словарь параметров содержит нулевую запись для параметра 'StockReceiptId' типа с непустым значением 'System.Int32' для метода 'System.Web.Mvc .ActionResult Update (Int32) 'в' WorcesterMarble.Controllers.StockReceiptController '. Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр. Наименование параметра: параметры
Где 6 - ID.
Если удалить идентификатор элемента, чтобы стать, как это:
window.location.href = "@Url.Action("Update","StockReceipt")"
Это работает, но мне нужно удостоверение личности, потому что я хочу, чтобы загрузить выбранный «ViewModel» в целях назначения.
Интересно, что я делаю неправильно ?!
Я попытался использовать это, но безрезультатно .:
window.location.href = @Url.RouteUrl("Default", new { @Controller = "StockReceipt", @Action = "Update"}) + '//' + stockReceiptId;
Взаимодействие с моделью действительно будет выбирать переменные запроса и использовать их для гидратации вашей модели, но я всегда считал эту конструкцию немного странной. Вы создаете половину своего URL с MVC, а вторую половину - с конкатенацией javascript. Почему бы не позволить MVC сделать весь тяжелый подъем? –
@ChrisHardie, потому что я использую сетку KendoUI. Навигация начинается с события кликов Javascript на пользовательской кнопке в KendoGrid. Как вы видите выше, при нажатии кнопки я беру идентификатор выбранной записи, а затем передаю этот идентификатор помощнику URL-адреса MVC. Пожалуйста, дайте мне знать, если есть лучший способ сделать это. Большое спасибо. –