#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>");
, и это сработало отлично! Спасибо!