protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
loadCountries();
loadRegions();
loadCities();
}
}
private void loadCountries()
{
Country country = new Country();
ddlCountry.DataSource = country.GetDataTable();
ddlCountry.DataTextField = "countryName";
ddlCountry.DataValueField = "countryID";
ddlCountry.DataBind();
}
private void loadRegions()
{
Region region = new Region();
ddlRegion.DataSource = region.GetRegionID(ddlCountry.SelectedValue);
ddlRegion.DataTextField = "regionName";
ddlRegion.DataValueField = "regionID";
ddlRegion.DataBind();
}
private void loadCities()
{
City city = new City();
ddlCity.DataSource = city.GetCityID(ddlRegion.SelectedValue);
ddlCity.DataTextField = "cityName";
ddlCity.DataValueField = "cityID";
ddlCity.DataBind();
}
protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
{
loadRegions();
if (ddlRegion.SelectedItem.Text == "No Province")
{
ddlRegion.Enabled = false;
loadCities();
}
else
{
ddlRegion.Enabled = true;
loadCities();
}
}
代码是Default.aspx(表示层)的后端
与Country相关的任何业务逻辑都被放入Country类,同样的规则应用于Region和City。
这个代码段设计好吗?换句话说,它是否符合表示层标准设计?如何改进此代码段设计(如果可能)?
我是新手,我试着确保我慢慢地,但肯定地。
答案 0 :(得分:3)
void loadDropDown(ComboBox cb, Object Source, string textField, string valueField)
{
cb.DataSource = Source;
cb.DataTextField = textField;
cb.DataValueField = valueField;
cb.DataBind();
}
//loadRegions
loadDropDown(ddlRegion, new Region().GetRegionID(ddlCountry.SelectedValue), "regionName", "regionID");
//etc for the other dropdown lists
但为了更全面地回答你的问题,它看起来不错。该代码是所有UI,因此这似乎是合理的。我的代码只是DRY的一个小方法。
答案 1 :(得分:3)
我认为命名约定需要一些工作。仔细考虑你的类和方法的名称。
例如(类名):
您有一个名为Country的类,表示它代表一个国家/地区。但是,我不认为这样做。看起来它负责创建国家数据表。
和另一个例子(方法名称):
您有一个名为Region.GetRegionID()的方法。它看起来(但我不完全确定)好像这得到一个基于RegionId的Region,所以我更喜欢GetByRegionId。对班级名称的同样批评也适用。
答案 2 :(得分:1)
ddlCountry_SelectedIndexChanged中的这个怎么样?
loadRegions();
ddlRegion.Enabled =(!ddlRegion.SelectedItem.Text.Equals(“No Province”));
loadCities();
答案 3 :(得分:1)
我看到你在UI中直接使用DataTable。从长远来看,这将导致可维护性问题。
您正在使用DataTable,因此直接在UI中使用数据库的列名。
因此,您的UI代码直接依赖于DataAccess层。
我认为您应该使用业务属性而不是数据库列名。