Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

жесткий секс с аспнет

400
25 сентября 2009 года
ArtemS2006
272 / / 12.01.2008
Ситуация следущая: есть у меня страничка с данными

есть там PresentationDropDownList, у которого датасорс PresentationObjectDataSource (это его наименование),
в текстовое поле идет строковая колонка Name с этого PresentationObjectDataSource
в поле данных идет колонка Id типа Guid с этого PresentationObjectDataSource

также DropDownList забиндин на основной MainObjectDataSource, на его поле presentation с типом как нетрудно догадаться Guid.
Отношения между таблицами Presentation и Main - один ко многим.

То есть при редактировании определенной строки из основного MainObjectDataSource, берется presentation из таблицы Main, для него по значению ищется нужное в PresentationDropDownList и в этом PresentationDropDownList отображается нужное имя name элемента из Presentation.


Теперь начинается жесть: мне нужно чтобы в PresentationDropDownList было также и пустое значение. Название "Любое представление", значение должно быть null, и при выборе "Любое представление" нужно записывать null в таблицу Main. Добавляю тот самый null в PresentationDropDownList в красивом окошечке свойств VS. И вот ведь незадача.

Во первых, при попытке сохранить строку из Main с выбранным "Любое представление" аспнет ругается что "" (пустая строка) не может быть преобразовано в Guid.
Этот касяк исправляется костылем, когда на методы ItemInserting и ItemUpdating объекта PresentationFormView (в нем редактирую строку из Main), добавляется код:
 
Код:
if (e.NewValues["presentation"].ToString() == "Любая")
            e.NewValues["presentation"] = null;


Во вторых: При считывании строки из Main с presentation=null опять ругань что в PresentationDropDownList не обнаружено заданное значение (оно ведь null а аспнет не могёт преобразовать null в "" для типа Guid)

с этим во вторых я имею секс до сих пор. за полдня не нашел как можно это исправить. Беда в том, что не нашел события, где PresentationDropDownList уже был бы забинден, но SelectedValue (которое null) ему еще бы не присвоилось.


И вот, значит, лирическое так скзать отступление: тимлид где то вычитал что использование Guid как первичного ключа является правильным подходом. Он человек опытный.
В аспнет DropDownList в качестве значения может содержать только строку. null типа Guid в строку и обратно автоматически не преобразуется. а может и не только типа Guid.
То есть получается что разработчики MS не реализовали этой весьма нужной фичи (преобразование пустой строки в Guid и обратно), изза отсутствия которой я полдня трахаюсь и ищу обходные пути.
Но зато у меня есть фигова куча свистелок и перделок в виде красивых мастерков настройки для выбора источника данных к ObjectDataSource и тд, что проще сделать руками или редактированием свойств. Они для каких целей вообще этот инструмент создавали? для создания индусами кучи страничек с определенным жестко заданным функционалом, без возможности добавить нестандартные фичи, которые не предусмотрели разработчики из МС?

Погуглил - не с первого раза нашел кучу тем про null в DropDownList. Но пока не одна не содержит нужного решения.
5
25 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Честно говоря не вижу проблемы. У DropDownList есть свойство OnDataBound - оно стреляет ровно после того, как список наполнился элементами в результате привязки данных. В этот момент закидываем в него "дефолтный" элемент.

Вот код тестового класса SampleDataItem:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;

/// <summary>
/// Summary description for SampleDataItem
/// </summary>
[DataObject]
public class SampleDataItem {
    public SampleDataItem(Guid id, string text) {
        this._id = id;
        this._text = text;
    }

    private readonly Guid _id;
    public Guid Id {
        get {
            return _id;
        }
    }

    private readonly string _text;
    public string Text {
        get {
            return _text;
        }
    }

    [DataObjectMethod(DataObjectMethodType.Fill)]
    public static SampleDataItem[] GetItems() {
        SampleDataItem[] result = new SampleDataItem[10];
        for (int i = 0; i < result.Length; ++i)
            result = new SampleDataItem(Guid.NewGuid(), "Item " + i);
        return result;
    }

}
Вот код разметки:
Код:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="ObjectDataSource1"
            DataTextField="Text" DataValueField="Id" &#111;&#110;databound="DropDownList1_DataBound" AutoPostBack="true">
        </asp:DropDownList>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetItems" TypeName="SampleDataItem"></asp:ObjectDataSource>
        <asp:Button ID="Button1" runat="server" &#111;&#110;click="Button1_Click" Text="Button" />
    </div>
    </form>
</body>
</html>
А вот код логики страницы:
Код:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{

    protected void DropDownList1_DataBound(object sender, EventArgs e) {
        ListItem default_item = new ListItem("Любое", null);
        default_item.Selected = true;
        DropDownList1.Items.Insert(0, default_item);
    }
    protected void Button1_Click(object sender, EventArgs e) {
        DropDownList1.SelectedValue = null;
    }
}
Каждое изменение списка (выбор элемента) приводит к post-бэку.
Если нажать на button1, то будет попытка выбрать элемент списка со значением null.


P.S. Может быть мы о разных контролах говорим? Не слышал о таком контроле как PresentationDropDownList в страндартной поставке ASP.NET 2.0.
400
25 сентября 2009 года
ArtemS2006
272 / / 12.01.2008
эммм... у меня значение дропдаунлиста забиндено на главный датасорс. Хотя вполне возможно что это выход, да и то придется отвязать бинд значения на главный датасорс и обрабатывать его вручную. а также дополнительно обрабатывать вручную события сохранения данных главного датасорса.
PresentationDropDownList - это просто наименование объекта, из которого легко определить его класс.

Ну а вообще говоря, пост не об этом был. Пост о том, что в технологиях микрасофт куча свистелкоперделочных фич при отсутствии нормального примитивного функционала.
и,да, придвидя наезды, скажу что всё это имхо. у меня пока нет опыта с другими веб фреймворками, конечно может быть все альтернативы окажутся не менее сложными для меня. хотя сомневаюсь
5
26 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: ArtemS2006
у меня значение дропдаунлиста забиндено на главный датасорс.


Сделайте примитивный пример. Не могу сообразить.

Цитата: ArtemS2006

Ну а вообще говоря, пост не об этом был. Пост о том, что в технологиях микрасофт куча свистелкоперделочных фич при отсутствии нормального примитивного функционала.

Какого? В дотнете пожалуй примитивного функционала поболее чем в ином другом языке, просто он нем нужно знать (вспоминаю свою тему про PInvoke) и уметь использовать. Привести "" (пустую строку) к Guid отказывается логика. Разве можно создать на основе такого объекта экземпляр int или double?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог