ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传

母版页(Master)

1.母版页是与Controller无关的,母版页只是一个View文件,而没有任何Controller与之相对应。

2.其实在ASP.NET MVC中View的aspx与母版页并不像WebForm中那样紧密关联。

例如我想更换一个aspx的母版页,只要在Action中return 时指定所要使用的Master即可:

image

如图我有2个Master文件,而/Views/Home/Index.aspx则为

image

这时我们如果想要使用Site2做为Master,只要在Action中return View指定masterName的参数即可:

   1: public ActionResult Index() {
   2:     return View(null,"Site2");
   3: }

自定义控件

RenderPartial

ASP.NET MVC中如果要自定义控件的话并不能像WebForm那样用<cc1:xxxx />这样来引用,而要使用Helper。

例如我们建立一个ct.ascx

image

其内容:

   1: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
   2: 我是ct.ascx

然后在Index.aspx里调用

   1: <%Html.RenderPartial("ct"); %>

OK(注意这里不是用<%=%>显示而是执行语句)

最终显示结果就是:

image 

用户自定义控件除了放在调用者同一目录下,也可以放在View/Shared中。而且这种自定义控件也是没有Controller支持的,仅是将View的部分提取为公共使用。

那么如果我们想调用的ascx有逻辑处理或调用数据库,也就是需要Controller的情况下,我们应该怎么办呢。

RenderAction

OK比如我想有一个有独立逻辑的ascx.

先要引用 Microsoft.Web.Mvc(http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471)

web.config/configuration/System.Web/pages/namespaces添加<add namespace="Microsoft.Web.Mvc"/>

那么和建立一个Action是一样的

Action:

   1: public ActionResult CtAction() {
   2:     return PartialView();//注意这里不是View
   3: }

View(CtAction.ascx)

   1: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
   2:  
   3: 显示当前Action:<%=this.ViewContext.RouteData.Values["action"]%>
View(Index.aspx):
   1: <%
   2:     Html.RenderAction("ctaction","home"); %>

OK运行起来,结果为:

image

文件的上传

下面来说一下与本篇本无关的话题就是文件的上传,我这里也不多做解释了,代码就是最好的语言。

View:

   1: <form action="<%=Url.Action("Process") %>" enctype="multipart/form-data" method="post">
   2: <input name="up1" type="file" /> <input type="submit" />
   3: </form>

Action(Process):

   1: public ActionResult Process(HttpPostedFileBase up1)
   2: {//参数名与name名一致即可
   3:     up1.SaveAs(Server.MapPath("~/" + up1.FileName));
   4:     return Content(up1.FileName);
   5: }

 

 

 

显示:image

提交后:image

再看看文件夹,文件已经上传成功:

image

 

至此,我想ASP.NET MVC重典一周年版已经没有什么基础东西可以讲了,如果大家想进一步学习ASP.NET MVC,请关注Asp.net Mvc Framework 系列的随时更新

posted @ 2009-04-29 11:41 重典 阅读(10900) 评论(17) 编辑 收藏

 回复 引用 查看   
#1楼2009-04-29 16:11 | asp.net初学者      
太好了,这篇很有用
 回复 引用 查看   
#2楼2009-06-01 13:31 | 胖胖鱼      
如果我在自定义的控件中有些值需要传到使用该控件的页面中,该页面如何取值?

比如:
我有一个ct控件,选取了某个键值对key和value。

我在home这个view中使用该ct控件,怎么取key和value??

 回复 引用 查看   
#3楼2009-06-01 13:32 | 胖胖鱼      
能说说RenderPartial和RenderAction这两种模式是如何传值的嘛?
 回复 引用 查看   
#4楼2009-06-12 23:58 | uncletwo      
<% Html.RenderAction("ctaction","home"); %>
Html没有RenderAction方法,为什么?
如果没有RenderAction方法,如何实现调用action实现逻辑ascx控件?

 回复 引用 查看   
#5楼2009-06-24 11:53 | 宁逍遥      
看到这里,我终于也忍不住要鄙视你了,讲就讲清楚点嘛,真的是!!!
 回复 引用   
#6楼2009-06-25 11:44 | snow123[未注册用户]
您好 我看了上传文件在mvc中,试着做了一个例子 可是运行到up1.SaveAs(Server.MapPath("~/" + up1.FileName));就报错 说是未将对象引用设置到对象的实例,请指教 在线等
 回复 引用 查看   
#7楼[楼主]2009-06-25 12:04 | 重典      
@snow123
<input name="up1" type="file" />的name要与 Action的参数同名

 回复 引用   
#8楼2009-06-25 12:14 | snow123[未注册用户]
@重典
我确保一致

 回复 引用   
#9楼2009-06-25 12:17 | snow123[未注册用户]
view层:<form action="/Life/PictureManageInfo" enctype="multipart/form-data" method=post>
<tr bgcolor="#214994">
<td height="25" colspan="2">
<div align="center">
<font color="#FFFFFF">内容管理(照片管理)</font></div>
</td>
</tr>
<tr>
<td height="28" class="style1">
<div align="right">
<font color="#214994">照片名称:</font></div>
</td>
<td width="363">
<input name="title" type="text" size="50" value="" onclick="Myselect_txt()" style="width: 211px">
</td>
</tr>
<tr>
<td height="28" class="style1">
<font color="#214994">&nbsp; 上传照片</font>
</td>
<td width="363" style="color: #FF0000">
<input type=file name="upl" />
(上传照片最大不超过3M)
</td>
</tr>
<tr>
<td height="20" class="style1">
<div align="right">
<font color="#214994">内容介绍:</font></div>
</td>
<td rowspan="2">
<textarea name="content" cols="50" rows="6" onclick="Myselect_txtarea()"></textarea>
</td>
</tr>
<tr>
<td height="10" class="style1">
&nbsp;
</td>
</tr>
<tr>
<td height="32" colspan="2">
<div align="center">
<input name="add" type="submit" id="add" value="上传" />
&nbsp;
<input id="Reset1" type="reset" value="重置" />
</div>
</td>
</tr></form>
controller层
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PictureManageInfo(HttpPostedFileBase upl)
{
upl.SaveAs(Server.MapPath("~/" + upl.FileName));
PictureManger pic = new PictureManger();
pic.Picture = SetImageToByteArray(upl.FileName);
return Content(upl.FileName);
}

 回复 引用   
#10楼2009-06-25 15:01 | snow123[未注册用户]
用一个talbe展示了列表信息每一行都有个文本框,输入信息后我在底下放了更新按钮 想要在action进行批量更新 可在action里怎样得到那个集合
????

 回复 引用 查看   
#11楼[楼主]2009-06-25 22:56 | 重典      
@snow123
HttpPostedFileBase
没有问题,我试了
你可以断点看看参数upl是否为空,再用IE Developer Tools看看是否Post中有文件流
再确定问题所在



 回复 引用 查看   
#12楼2010-03-19 08:55 | 撞破南墙      
@snow123

有可能是 你 from 框 被 嵌套了。

 回复 引用 查看   
#13楼2010-04-04 20:40 | boyofcity      
#12楼2010-03-19 08:55 | 撞破南墙
@snow123

有可能是 你 from 框 被 嵌套了。

在母版里有一个FORM,这里又设置了一个FORM。
真的是被嵌套了,那怎么办呢?又必须在母版里设置form。

 回复 引用 查看   
#14楼[楼主]2010-04-04 21:50 | 重典      
@boyofcity
为什么要在母版页里面一定要有Form,ASP.NET MVC中是不必的

 回复 引用 查看   
#15楼2010-04-04 22:54 | boyofcity      
Thank you
 回复 引用 查看   
#16楼2010-04-08 09:26 | Mr.King      
up1.SaveAs(Server.MapPath("~/" + up1.FileName));

这个玩意儿 在chrome和ie里,还不一样....

 回复 引用 查看   
#17楼2010-07-14 17:31 | 溶入海洋中的雨滴      
您好 我在项目里使用一个form来post back到服务器,其中这个form内含有一个用户控件,控件里有一些文本框,当我post back的时候,出现“验证视图状态 MAC 失败”的错误,就算我在web.config或页面的page里加上EnableEventValidation="false" EnableViewStateMac="false",问题依旧。不知博主和各位有没遇见这种情况,先感谢各位了