none
Создание связанного с таблицей DropDownList на MVC RRS feed

  • Вопрос

  • Есть база данных, есть несколько таблиц.
    В MainContent надо поместить DropDownList и ниже таблицу для отображения выбранной таблицы в DropDownList.

    Как обойтись без элементов веб-форм <asp:***>

    А написать все на чистом MVC через контроллер отображений ?

    Заранее благодарен.

    15 октября 2009 г. 15:34

Ответы

  • Со скриптом и привязкой немного перемудрил :)
    <%=Html.DropDownList("search", (IEnumerable<SelectListItem>)ViewData["search"], "--- please  select a table ---")%>
    <script type="text/javascript">
        $(function() {
            $("#search").change(function() {
                var tableName = $(this).val();
    
                if (tableName != "") {
                    $("#TableView").load(
                        '<%= Url.Action("ShowTableData", "TableView") %>',
                        { tableName: tableName }
                    );
                }
            });
        });
    </script>
    <div id="TableView">
        Здесь будут показаны данные таблицы
    </div>
    

    Метод контроллера:
    public ActionResult ShowTableData(string tableName)
    {
        // выбрать данные таблицы
        return PartialView("TableData", "Данные для " + tableName);
    }
    TableData.ascx (partial view)

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
    Данные: <%= this.Model %>
    

    Роуты стандартные. Попробуй заставить заработать в таком виде, потом переделай со string на ITable.

    Насчет null reference - отладь, наверняка там что-то просто null.
    • Предложено в качестве ответа I.Vorontsov 19 октября 2009 г. 6:01
    • Помечено в качестве ответа I.Vorontsov 19 октября 2009 г. 11:42
    18 октября 2009 г. 9:26

Все ответы

  • Попробуй конкретизировать вопрос. Что именно не получается? Выбрать список таблиц? Показать DropDownList? Выбрать данные таблицы из базы? Вытянуть с сервера данные для выбранной таблицы?
    Будет ли структура базы меняться после создания приложения? Если нет, то посмотри в сторону ASP.NET Dynamic Data MVC

    17 октября 2009 г. 13:22
  • Привет. В общем смотри. Дропдаун я сделал так (скажи, если можно как-то по другому под данную задачу):

    Представление:

    <%=Html.DropDownList("search", (IEnumerable<SelectListItem>)ViewData["search"], htmlAttributes)%>

    В dropdown я записываю названия таблиц из базы данных через запрос к базе данных.

    Action Контроллера:
    тут я делаю запрос и пока чисто ради заглушки статично одну таблицу. а в viewdata["search"] попадает список таблиц.

    db = new ComponentsDataContext();
    List<string> list1 = new List<string>(db.ExecuteQuery<string>("SELECT name FROM sys.sysobjects WHERE (name LIKE 'cad_%')", new object[] { }));
    ViewData["search"] = new SelectList(list1);
    return View(db.cad_NPNs);
    Я связал функцию onclick с jquery:

    function dropdownlist_onclick() {
        $("select#search").change(
            function() {
                $("div#TableView").load(function() { $.ajax("/TableView/ShowTableData/" + $("select#search").val()); });
            });
    }
    1. не понимаю, функция срабатывает, если я вписываю в div текст, но в html он не записывается, лишь отображается - это правильно ?
    Надо ли делать запись в response данных, чтобы они непосредственно в разметке появились ? и как это сделать, я не знаю.

    2. тот код, что есть сейчас в функции , пытается открыть url который ведет к action в контроллере.

    Route:

    routes.MapRoute(
                    "Text",
                    "{controller}/{action}/{text}",
                    new { controller = "TableView", action = "ShowTableData" });

    тот Action, что выше, пока что статически возвращает выбранную таблицу, но мне надо по тексту, который поступает в action через роутинг, сопоставить строку из дропдауна с именем таблицы в linq datacontext...
    фактически надо по имени найти таблицу и возвратить ее в виде web.data.linq.table во view...

    и уже там у меня приклеен класс отображения gridView в виде хелпера...

    namespace System.Web.Mvc.Html
    {
        public static class GridExtensions
        {
    
            public static string GridView(this HtmlHelper htmlHelper, ITable table)
            {
                return GridView(htmlHelper, table, null, new GridViewOptions());
            }
    
            public static string GridView(this HtmlHelper htmlHelper, ITable table, string[] headers)
            {
                return GridView(htmlHelper, table, headers, new GridViewOptions());
            }
    
            public static string GridView(this HtmlHelper htmlHelper, ITable table, bool includeLinks)
            {
                return GridView(htmlHelper, table, null, includeLinks);
            }
    
            public static string GridView(this HtmlHelper htmlHelper, ITable table, string[] headers, bool includeLinks)
            {
                var options = new GridViewOptions();
                if (!includeLinks)
                {
                    options.ShowViewButton = false;
                    options.ShowEditButton = false;
                    options.ShowDeleteButton = false;
                }
                return GridView(htmlHelper, table, null, options);
            }
    
            public static string GridView(this HtmlHelper htmlHelper, ITable table, string[] headers, GridViewOptions options)
            {
                // Show edit column?
                bool showEditColumn = options.ShowViewButton || options.ShowEditButton || options.ShowDeleteButton;
    
                // Get identity column name
                string identityColumnName = GridExtensions.GetIdentityColumnName(table);
    
                // Get column names and headers
                var columnNames = GridExtensions.GetColumnNames(table);
                if (headers == null)
                    headers = columnNames;
    
                // Open table
                var sb = new StringBuilder();
                sb.AppendLine("<table>");
    
                // Create Header Row
                sb.AppendLine("<thead>");
                sb.AppendLine("<tr>");
                if (showEditColumn)
                    sb.Append("<th></th>");
                foreach (String header in headers)
                    sb.AppendFormat("<th>{0}</th>", header);
                sb.AppendLine("</tr>");
                sb.AppendLine("</thead>");
    
                // Create Data Rows
                sb.AppendLine("<tbody>");
                sb.AppendLine("<tr>");
                foreach (Object row in table)
                {
                    if (showEditColumn)
                    {
                        int identityValue = (int)DataBinder.GetPropertyValue(row, identityColumnName);
                        sb.Append("<td><small>");
                        if (options.ShowViewButton)
                        {
                            sb.Append(htmlHelper.ActionLink(options.ViewButtonText, options.ViewAction, new { Id = identityValue }));
                            sb.Append("&nbsp;");
                        }
                        if (options.ShowEditButton)
                        {
                            sb.Append(htmlHelper.ActionLink(options.EditButtonText, options.EditAction, new { Id = identityValue }));
                            sb.Append("&nbsp;");
                        }
                        if (options.ShowDeleteButton)
                        {
                            sb.Append(htmlHelper.ActionLink(options.DeleteButtonText, options.DeleteAction, new { Id = identityValue }));
                        }
                        sb.Append("</small></td>");
                    }
                    foreach (string columnName in columnNames)
                    {
                        string value = DataBinder.GetPropertyValue(row, columnName).ToString();
                        sb.AppendFormat("<td>{0}</td>", HttpUtility.HtmlEncode(value));
                    }
                    sb.AppendLine("</tr>");
                }
                sb.AppendLine("</tbody>");
    
                sb.AppendLine("</table>");
                return sb.ToString();
            }
    
            public static string[] GetColumnNames(ITable table)
            {
                return table
                    .Context
                    .Mapping
                    .GetMetaType(table.ElementType)
                    .PersistentDataMembers.Select(m => m.Name)
                    .ToArray();
            }
    
            public static string GetIdentityColumnName(ITable table)
            {
                return table
                    .Context
                    .Mapping
                    .GetMetaType(table.ElementType)
                    .DBGeneratedIdentityMember
                    .Name;
            }
        }
    
        public class GridViewOptions
        {
            private bool _showViewButton = true;
            private bool _showEditButton = true;
            private bool _showDeleteButton = true;
    
            private string _viewButtonText = "[View]";
            private string _editButtonText = "[Edit]";
            private string _deleteButtonText = "[Delete]";
    
            private string _viewAction = "View";
            private string _editAction = "Edit";
            private string _deleteAction = "Delete";
    
            public bool ShowViewButton
            {
                get { return _showViewButton; }
                set { _showViewButton = value; }
            }
    
            public bool ShowEditButton
            {
                get { return _showEditButton; }
                set { _showEditButton = value; }
            }
    
            public bool ShowDeleteButton
            {
                get { return _showDeleteButton; }
                set { _showDeleteButton = value; }
            }
    
            public string ViewButtonText
            {
                get { return _viewButtonText; }
                set { _viewButtonText = value; }
            }
    
            public string EditButtonText
            {
                get { return _editButtonText; }
                set { _editButtonText = value; }
            }
    
            public string DeleteButtonText
            {
                get { return _deleteButtonText; }
                set { _deleteButtonText = value; }
            }
    
            public string ViewAction
            {
                get { return _viewAction; }
                set { _viewAction = value; }
            }
    
            public string EditAction
            {
                get { return _editAction; }
                set { _editAction = value; }
            }
    
            public string DeleteAction
            {
                get { return _deleteAction; }
                set { _deleteAction = value; }
            }
        }
    }


    вывод: в плюс к тем вопросам, что я не понимаю, выходит еще два:

    1. почему-то не срабатывает хелпер, когда я через view туда передаю таблицу, хотя он под это заделан. пишет, что внутри где-то не задана ссылка на объект.
    2. надо как-то по тексту найти таблицу с ее содержанием и возвратить в виде system.web.linq.table

    я новичек, поэтому много не знаю и если честно, я в полном ступоре...

    Спасибо, что откликнулся!

    17 октября 2009 г. 14:47
  • Со скриптом и привязкой немного перемудрил :)
    <%=Html.DropDownList("search", (IEnumerable<SelectListItem>)ViewData["search"], "--- please  select a table ---")%>
    <script type="text/javascript">
        $(function() {
            $("#search").change(function() {
                var tableName = $(this).val();
    
                if (tableName != "") {
                    $("#TableView").load(
                        '<%= Url.Action("ShowTableData", "TableView") %>',
                        { tableName: tableName }
                    );
                }
            });
        });
    </script>
    <div id="TableView">
        Здесь будут показаны данные таблицы
    </div>
    

    Метод контроллера:
    public ActionResult ShowTableData(string tableName)
    {
        // выбрать данные таблицы
        return PartialView("TableData", "Данные для " + tableName);
    }
    TableData.ascx (partial view)

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
    Данные: <%= this.Model %>
    

    Роуты стандартные. Попробуй заставить заработать в таком виде, потом переделай со string на ITable.

    Насчет null reference - отладь, наверняка там что-то просто null.
    • Предложено в качестве ответа I.Vorontsov 19 октября 2009 г. 6:01
    • Помечено в качестве ответа I.Vorontsov 19 октября 2009 г. 11:42
    18 октября 2009 г. 9:26
  • =) Спасибо =) Работает. Но мне пришлось убрать из кода GridView , options. Стивен Уолтер там получает какие-то уникальные идентификаторы для значений таблицы, как ты можешь посмотреть, а у меня они не автогенерируются. Ты не знаешь, как сделать, чтобы они сами генерировались ?
    19 октября 2009 г. 10:33
  • Один топик - один вопрос ;)
    19 октября 2009 г. 13:15