您的位置:首页 > 编程语言 > ASP

使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之二

2008-04-16 23:39 966 查看
[前言]

前几天发过一篇blog:使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一

在第一篇blog中,展示了使用Mvc_Scaffold_gen_setup.exe生成的Mvc代码,包括其中的一些错误。

隔了几天,我把生成的代码重新整理下,并加些数据进去做测试。发现了几个问题(稍后列出问题),想在这里向各位咨询。

[业务介绍]

写这个程序的初衷是为了熟悉Asp.net MVC,正好要给自己写一个家庭帐务管理的小程序。我想尽可能简单化所有的业务需求,尽量不涉及专业的业务,另外,后期考虑增加帐务预估和报表反馈等功能。

下面介绍下示例中的家庭帐册大管家的业务需求及数据结构:

顾名思义,就是辅助记帐。目前的功能模块有:

1、收入,对应的数据模型是Income;

2、支出,对应的数据模型是Expense;

3、借还,对应的数据模型是AttachAccount;

4、帐务管理,对应的数据模型是Account;

5、帐务分类管理,包括大类和小类,对应的数据模型分别是PrimaryClass和ChildClass;

6、转账,对应的数据模型是TranferAccount;

7、家庭成员管理,对应的数据模型是Member。

下面见数据模型图,是从解决方案AccountBookDB.dbml截图来的。

<li>

<%= Html.ActionLink("Account", "List", "Account") %></li>

<li>

<%= Html.ActionLink("AttachAccount", "List", "AttachAccount")%></li>

<li>

<%= Html.ActionLink("ChildClass", "List", "ChildClass")%></li>

<li>

<%= Html.ActionLink("PrimaryClass", "List", "PrimaryClass")%></li>

<li>

<%= Html.ActionLink("Expense", "List", "Expense")%></li>

<li>

<%= Html.ActionLink("Income", "List", "Income")%></li>

<li>

<%= Html.ActionLink("TranferAccount", "List", "TranferAccount")%></li>

<li>

<%= Html.ActionLink("Member", "List", "Member")%></li>
10、编译,运行,增加一些数据,或者下载我的数据库备份:点击下载

[修改代码]

好,以上的程序都能正常运行,现在来看这个模块:http://localhost:19374/ChildClass/Add (前面的19374端口可能有变,自己修改)

输入ChildClassName和PrimaryClassID,很显然,这里的PrimaryClassID不够人性化,还不能做到Html下拉框的方式。

于是我们作如下修改:

1)在Models中增加类文件ChildClassViewData.cs,里面包含两个类:ChildClassEditViewData和ChildClassNewViewData,代码如下:
namespace AccountBook.Models

public void Add()

<input type="text" name="PrimaryClassID" id="PrimaryClassID" value="<%= Item.PrimaryClassID%>" />
现在我们就可以将其修改为:

<%=Html.Select("PrimaryClassID", ViewData.PrimaryClassList) %>
使用的是HtmlHelp中的Select重载方法来绑定下拉框。“PrimaryClassID”是控件名称,第二个参数是数据源。

同样,在Views/ChildClass/Edit.aspx中,我们同样将相关代码

<input type="text" name="PrimaryClassID" id="PrimaryClassID" value="<%= Item.PrimaryClassID%>" />
替换为如下:
<%=Html.Select("PrimaryClassID", Item.PrimaryClassList, Item.ChildClassInfo.PrimaryClassID) %>
在Edit.aspx页面,显示出当前ChildClass所对应的PrimaryClassID,也是以下拉框的形式表示,同时默认选择PrimaryClassID对应的PrimaryClassName,各参数含义同上,第三个参数就是默认选择的PrimaryClassID。

4)好,现在打开Views/ChildClass/List.aspx页面,显示了当前所有ChildClass,我们看下这部分的代码:
<h2>ChildClass List <%= Html.ActionLink("Add","Add" ) %> </h2>

<% AccountBookTest.Models.ChildClassList Lst = ViewData; %>

<%

if (ViewContext.TempData["msg"] != null)

%>

<form>

<table>

<tr>

<td><strong>ChildClassName</strong></td>

<td><strong>PrimaryClassID</strong></td>

</tr>

<%foreach (AccountBookTest.Models.ChildClass item in Lst) %>

</table>

<p></p>

</form>
可以看到,有一个很亲切的c#代码foreach语句出现,它的作用是循环当前的AccountBookTest.Models.ChildClassList Lst,逐一显示ChildClass的信息:ChildClassName,PrimaryClassID以及两个可选操作Edit和Delete。

现在我们进行如下修改:

<h2>

ChildClass List

<%=Html.ActionLink("Add","Add" ) %>

</h2>

<% AccountBook.Models.ChildClassList Lst = ViewData; %>

<%

if (ViewContext.TempData["msg"] != null)

%>

<table>

<tr>

<td>

<strong>ChildClassName</strong>

</td>

<td>

<strong>PrimaryClass</strong>

</td>

<td>

<strong>Edit</strong>

</td>

<td>

<strong>Delete</strong>

</td>

</tr>

<asp:Repeater ID="AllChildClass" runat="server"

onitemdatabound="AllChildClass_ItemDataBound">

<ItemTemplate>

<tr>

<td>

<%# Eval("ChildClassName") %>

</td>

<td>

<%# Eval("PrimaryClassID") %>

</td>

<td>

<asp:HyperLink ID="hlEdit" runat="server">Edit</asp:HyperLink>

</td>

<td>

<asp:HyperLink ID="hlDelete" runat="server">Delete</asp:HyperLink>

</td>

</tr>

</ItemTemplate>

</asp:Repeater>

</table>
用一个服务器端控件Reapter绑定ChildClassList.因此,List.aspx.cs中的代码修改为如下:

public partial class ChildClassListView : ViewPage<ChildClassList>

{

{

{

{

ChildClassInfo childClassInfo = (ChildClassInfo)e.Item.DataItem;

HyperLink hlEdit = (HyperLink)e.Item.FindControl("hlEdit");

HyperLink hlDelete = (HyperLink)e.Item.FindControl("hlDelete");

hlEdit.NavigateUrl = "http://www.cnblogs.com/ChildClass/Edit/" + childClassInfo.ChildClassID;

hlDelete.NavigateUrl = "http://www.cnblogs.com/ChildClass/Delete/" + childClassInfo.ChildClassID;

}

}

}
现在我的问题来了:

1)页面上使用的服务器端控件Reapter,在CodeFile中居然必须声明,否则无法识别,为什么会这样?所有服务器控件都必须声明,我之前看的一个例子就没有,怎么回事?麻烦各位帮我找找原因。

[2008.04.17晚回答]在解决方案上右键——>Convert to Web Applications就可以把解决方案变成Web Application的形式。这一个Convert其实就是给每个页面(比如Test.aspx)增加对应的Test.designer.cs的文件,然后页面上的控件的声明全部放在这里。其实这个答案应该早就想到,只是太专注于MVC,反而忘了根本的web Application文件结构。

2)在修改之前的页面代码中的foreach语句,可以使用<%=Html.ActionLink("Edit","Edit",new {id = item.ChildClassID})%>来很方便很直接地放置一个Edit链接,链接地址是ChildClass/Edit/[ChildClassID],

现在问题是,我使用了Reapter控件直接绑定数据源之后,怎样才可以类似<%=Html.ActionLink("Edit","Edit",new {id = item.ChildClassID})%>这样的写法,直接生成一个Edit的链接呢?疑惑在于,在Reapter中无法把[ChildClassID]传到<%=Html.ActionLink("Edit", "Edit", ……)%>中的"……"中。

怎么办?我暂时只能采用webForm的做法,在ItemBound事件中动态绑定......那请问,是我的做法有错误还是本身就不能通过服务器控件绑定的方式来动态生成Edit按钮?

ps:Delete的也是同样问题。

3)2008.04.17补充一个问题:显示ChildClass信息的时候,由于Model.ChildClassInfo中仅有PrimaryClassID属性 ,但如果要显示出PrimaryClassID对应的PrimaryClassName,那该如何实现?在Model.ChildClassInfo中增加PrimaryClassName属性??还是在Controllers中进行匹配?补充:这其实是类设计的范畴,和mvc没多大关系的。

总结:今天的blog就写这些内容,就是ChildClass的Add和Edit,以及List的显示。同时提了三个问题,留给大家帮我解决。

本文最新Demo下载地址是:AccountBook.rar(最新)

以及数据库的备份(含数据):AccountBookDB.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐