Добавление ссылки на сетку пользовательского интерфейса Kendo для каждого элемента с идентификатором элемента в href

#linq #gridview #kendo-ui #kendo-grid #kendo-asp.net-mvc

#linq #gridview #kendo-ui #kendo-grid #kendo-asp.net-mvc

Вопрос:

Я разрабатываю в Razor MVC .NET. У меня есть entity framework, где мои данные возвращаются нормально, т. Е. У меня есть эта настройка, например:

Модель:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyProject.Web.Models
{
    public class Training
    {
        public int Id {get; set;}
        public string Name {get; set;}
        public string editLink {get; set;}
    }
}
  

Контроллер:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity;
using MyProject.Entities;
using MyProject.Data;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;
using MyProject.Web.Models;

namespace MyProject.Web.Controllers
{
    public class TrainingController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Read([DataSourceRequest] DataSourceRequest request)
        {
            using (var db = new MyDb(false))
            {
                var data = db.Training.Select(d => new TrainingModel
                {
                    Id = d.Id,
                    Name = d.Name
                    // I want to do this, here:
                    // editLink = "<a href=Training.cshtml?mode=editamp;Id="   d.Id   " target=_blank>Edit Training</a>";
                }).ToDataSourceResult(request);
                return Json(data, JsonRequestBehavior.AllowGet);
            }
         }
    }
}
  

Представление не важно — стандартный gridview на основе пользовательского интерфейса Kendo, который вызывает процедуру «Чтения» выше. Я также немного изменил код, чтобы дать общее представление о том, что я делаю.

Что я хочу сделать, так это объединить гиперссылку с каждым идентификатором и отобразить ее в столбце в gridview для каждого элемента, чтобы пользователь мог щелкнуть по этой ссылке и перейти на другую страницу, где он может редактировать свой элемент. Я не могу выполнить строку, которую я прокомментировал выше, потому что «Id» — это значение int в базе данных, и мне нужно иметь HTML в виде строки или, может быть, объекта? В любом случае, они не смешиваются в форматах, в которых они находятся сейчас, и LINQ, похоже, не позволяет вам изменять его на лету.

  • Я попробовал SqlFunctions.ConvertString , и он даже не распознает SqlFunctions как тип.
  • Я бы использовал встроенное редактирование, но есть данные из других таблиц базы данных, которые мне нужно будет показать на другой странице вместе с идентификатором, а элементы управления Kendo позволяют сосредоточиться только на одной таблице за раз.

Итак, вкратце, как мне вставить ссылку в столбец gridview, используя этот оператор Select, или я могу? Или есть другой способ отредактировать данные Json до того, как они будут возвращены? Или люди делают это каким-то другим способом полностью?

Ответ №1:

Я бы отправил URL-адрес в виде строки, такой как Url.Action() , а затем в клиентском использовании используйте Column.ClientTemplate() в столбце сетки с привязкой. Это сработает, если вы используете оболочку Mvc для сетки.

     [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Read([DataSourceRequest] DataSourceRequest request)
    {
        using (var db = new MyDb(false))
        {
            var data = db.Training.Select(d => new TrainingModel
            {
                Id = d.Id,
                Name = d.Name
                // I want to do this, here:
                editLink = "Training.cshtml?mode=editamp;Id="   d.Id.ToString();
            }).ToDataSourceResult(request);
            return Json(data, JsonRequestBehavior.AllowGet);
        }
     }
  

Конфигурация сетки:

 @(Html.Kendo().Grid<MyClass.MyCollection>()
    .Name("myGrid")        
    .Columns(columns =>
    {
        columns.Bound(t => t.editLink).Title("Action").ClientTemplate("<a href='${editLink}' target=_blank>Edit Training</a>");  
    //OR       
        columns.Bound(t => t.id).Title("Action").ClientTemplate("<a href='Training.cshtml?mode=editamp;Id=${id}' target=_blank>Edit Training</a>");  


    })
    ....
)
  

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

1. Спасибо, но d.Id.ToString() не работает. «LINQ для объектов не распознает систему метода. Ошибка заключается в методе String toString()’, и этот метод не может быть преобразован в выражение хранилища». Linq не позволяет . toString().

2. Ваша 2-я часть, конфигурация сетки работает, хотя! Вы были правы, я мог бы просто использовать идентификатор во 2-х столбцах. Привязанный оператор. Я только что добавил columns.Bound(p => p.Id).Title("Action").ClientTemplate("<a href='Training.cshtml?mode=editamp;Id=${id}' target=_blank>Edit Training</a>"); , и это сработало отлично! Спасибо!