所以我的数据库中有一个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。
答案 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;
}