在asp.net中更改img src

时间:2016-12-22 08:44:03

标签: c# html asp.net .net

所以我的数据库中有一个bool列,表示访问者是否是“Inhouse”。如果值为true,我希望img src为:const string checkedIn = "/Images/Icons/Visitor-checkedin-16x16.png"; if false,我希望它是另一个src。而且,如果访问者尚未访问,“内部”应该是false并且“expectedArrival”日期尚未到期。这是我的代码:

C#:

public string GetImageUrl(string inhouse, DateTime expectedArrival)
{
    const string checkedIn = "/Images/Icons/Visitor-checkedin-16x16.png";
    const string checkedOut = "/Images/Icons/Visitor-checkedout-16x16.png";
    const string notArrived = "/Images/Icons/Visitor-notarrived-16x16.png";

    if (ToBool(inhouse))
    {
        inhouse = checkedIn;
    }

    else if (ToBool(inhouse) == false && expectedArrival.AddDays(0) <= DateTime.Now)
    {
        inhouse = notArrived;
    }

    else
    {
        inhouse = checkedOut;
    }

    return inhouse;
}

private static bool ToBool(string value, bool defaultValue = false)
{
    bool result;
    return bool.TryParse(value, out result)
        ? result
        : defaultValue;
}

ASPX:

<asp:Repeater runat="server" OnItemDataBound="rptVisitedItem_OnItemDataBound" OnItemCommand="rptVisitedItem_OnItemCommand" ID="rptVisitedItem">
     <ItemTemplate>
        <tr>
            <td>
                <img src='<%# GetImageUrl(Eval("Inhouse").ToString(), Convert.ToDateTime(Eval("ExpectedArrival"))) %>'alt="" class="statusIcon" />
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

我哪里做错了?我只得到一张图像来显示atm。

2 个答案:

答案 0 :(得分:5)

有一些明显的问题需要清理:

1)假设您的Repeater中的原始“inhouse”变量是bool,然后将其转换为字符串,然后将其转换回bool是没有意义的,并且因为您的ToBool方法不正确而导致问题。 / p>

如果转换过程成功,则TryParse返回true,如果没有,则返回false(总是阅读手册!https://msdn.microsoft.com/en-us/library/system.boolean.tryparse(v=vs.110).aspx)。转换后的bool的实际值包含在result中,您不从该方法返回。相反,您将返回成功值。如果你的转换总是成功,那么ToBool总是返回true,这就是为什么你总是得到相同的图像。

2)你通过赋予它两个含义来滥用内部变量 - 首先它是一个bool来说明内部是否有内容,然后它是一个包含图像URL的字符串。它不应该是两者兼而有之。变量应该有一个目的。你所做的是不好的做法,并会混淆任何阅读它的人(包括你,在一年的时间里!)。做这样的事情也是一种产生意外问题的方法。

所以,在转发器中:

<%# GetImageUrl(Eval("Inhouse"), Convert.ToDateTime(Eval("ExpectedArrival"))) %>

(另外一点:如果ExpectedArrival不是DateTime,为什么不呢?它应该是。如果它来自你的数据库它不应该是一个字符串。如果 已经是DateTime,没有必要转换它。)

其次,方法:

public string GetImageUrl(bool inhouse, DateTime expectedArrival)
{
    const string checkedIn = "/Images/Icons/Visitor-checkedin-16x16.png";
    const string checkedOut = "/Images/Icons/Visitor-checkedout-16x16.png";
    const string notArrived = "/Images/Icons/Visitor-notarrived-16x16.png";
    string imageUrl = null; //separate variable to hold the chosen image URL

    if (inhouse == true)
    {
        imageUrl = checkedIn;
    }
    else if (inhouse == false && expectedArrival.AddDays(0) <= DateTime.Now)
    {
        imageUrl = notArrived;
    }
    else
    {
        imageUrl = checkedOut;
    }

    return imageUrl;
}

答案 1 :(得分:1)

认为你可能会尝试通过快速查看代码来做这样的事情:

public string GetImageUrl(string inhouse, DateTime expectedArrival)
{
    const string checkedIn = "/Images/Icons/Visitor-checkedin-16x16.png";
    const string checkedOut = "/Images/Icons/Visitor-checkedout-16x16.png";
    const string notArrived = "/Images/Icons/Visitor-notarrived-16x16.png";

    bool result;
    bool.TryParse(inhouse, out result);

    if (result)
    {
        inhouse = checkedIn;
    }

    else if (expectedArrival.AddDays(0) <= DateTime.Now)
    {
        inhouse = notArrived;
    }
    else
    {
        inhouse = checkedOut;
    }

    return inhouse;
}