4

Привет Я использую следующий код для перенаправления из кендо сетки на другую страницу (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; 

ответ

7

решаемые так:

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=" + stockReceiptId; 
    } 

Подробнее here

+0

Взаимодействие с моделью действительно будет выбирать переменные запроса и использовать их для гидратации вашей модели, но я всегда считал эту конструкцию немного странной. Вы создаете половину своего URL с MVC, а вторую половину - с конкатенацией javascript. Почему бы не позволить MVC сделать весь тяжелый подъем? –

+0

@ChrisHardie, потому что я использую сетку KendoUI. Навигация начинается с события кликов Javascript на пользовательской кнопке в KendoGrid. Как вы видите выше, при нажатии кнопки я беру идентификатор выбранной записи, а затем передаю этот идентификатор помощнику URL-адреса MVC. Пожалуйста, дайте мне знать, если есть лучший способ сделать это. Большое спасибо. –

4

Я считаю, что все, что вы ищете это:

window.location.href = "@Url.Action("Update","StockReceipt", new { id = 6 })" 

http://msdn.microsoft.com/en-us/library/dd505151%28v=vs.118%29.aspx

+0

Да, но сейчас я решил, как указано выше. –

+1

В вашем маршруте по умолчанию ваш переменный параметр называется id, поэтому, если вы не укажете имя переменной, оно вернется к id. defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional} Это также будет работать "@ Url.Action (" Update "," StockReceipt ", новый {stockReceiptId = 6})" – Marko

Смежные вопросы