Asp.net Mvc 不使用服务器控件的原因:
1.要使用服务器控件处理自己的交互,发送(post)操作需要始终返回到其中声明控制器页面,这是通过使用臭名昭著的回送概念完成的,在asp.net mvc 中不使用该概念;
2.控件只能操作边界的内容,边界外的所有内容必须和以前一样返回给用户,这个工作是通过将页面的所有组件储存的到页面视图状态中完成的,在mvc中没有提供该抽象过程。
局部视图:
实际局部视图就是mvc用户控件,较小的可以重新使用试图块。局部视图的目的是呈现视图的一部分,从父对象的viewdata获取数据或者通过专门为其传递模型对象的获取数据。从技术层面来说,局部只是一个视图,其中包含的页面片段,当使用默认的webforms 视图引擎是,其扩展名为.ascx。
Html的辅助方法RenderPartial可以方便的将局部视图插入的视图中。该方法的参数如下:
parialViewName:局部视图的名称不带扩展名
Model:传送到局部视图的模型对象
ViewData:传送到局部视图的ViewData字典。
如果仅指定视图名称;父对象的Viewdata将传送到局部视图,如果希望使用模型对象,将viewdata为空,如果希望两者都传递数据,就必须使用完整的重载方法将所用的内容传送到视图。
视图引擎查找局部视图的,首先在包含父视图的文件夹中查找,然后在shared 文件夹中查找,这说明局部视图只能在有同一个控制器或者所以控制器呈现视图之间的共享。
示例:
Model:
public enum DifficutlyLevel
{
Easy,
Medium,
Hard,
Strenous,
ArmstrongLevel
}
public class Climb
{
public string Name { get; set; }
public DifficutlyLevel Difficutly { get; set; }
public double Length { get; set; }
public double Gain { get; set; }
public double AveageGrade { get; set; }
}
public class ClimbList : List<Climb>
{
public ClimbList()
{
}
public ClimbList(IEnumerable<Climb> collection)
: base(collection)
{
}
}
public class ClimbRepository
{
private ClimbList _climblist;
public ClimbRepository()
{
_climblist = new ClimbList();
_climblist.Add(new Climb()
{
Name = "lin.su1",
Length = 43.5,
AveageGrade = 7.4,
Gain = 1805,
Difficutly = DifficutlyLevel.Hard
});
_climblist.Add(new Climb()
{
Name = "lin.su2",
Length = 43.6,
AveageGrade = 7.5,
Gain = 1806,
Difficutly = DifficutlyLevel.Medium
});
_climblist.Add(new Climb()
{
Name = "lin.su3",
Length = 43.7,
AveageGrade = 7.6,
Gain = 1807,
Difficutly = DifficutlyLevel.Strenous
});
_climblist.Add(new Climb()
{
Name = "lin.su3",
Length = 43.8,
AveageGrade = 7.7,
Gain = 1808,
Difficutly = DifficutlyLevel.ArmstrongLevel
});
_climblist.Add(new Climb()
{
Name = "lin.su3",
Length = 43.9,
AveageGrade = 7.8,
Gain = 1809,
Difficutly = DifficutlyLevel.Easy
});
}
public ClimbList GetTopclimbs()
{
var query = from c in _climblist
orderby c.Name
select c;
return new ClimbList(query);
}
public Climb GetClimb(string name)
{
var climb = from c in _climblist
where c.Name == name
select c;
return climb.First();
}
}
Controller:
public ActionResult UserControll()
{
ViewData["Msg"] = "Welcome to the climb ! asp.net Mvc";
var _repository = new ClimbRepository();
var climbs = _repository.GetTopclimbs();
ViewData["Climbs"] = climbs;
return View();
}
public ActionResult Climb(string name)
{
var _reposiotry = new ClimbRepository();
Climb climb = _reposiotry.GetClimb(name);
var climbs = _reposiotry.GetTopclimbs();
ViewData["Climbs"] = climbs;
return View(climb);
}
View:
局部视图View:_allcimbs.ascx
<%@ Import Namespace="MvcTest.Models" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ClimbList>" %>
<div style="border:1px solid red">
<ul>
<% foreach (var climb in Model)
{ %>
<li><%= Html.ActionLink(climb.Name, "Climb", new { name = climb.Name })%></li>
<%} %>
</ul>
</div>
调用局部视图 :UserControll.aspx:
<%@ Import Namespace="MvcTest.Views.CustemHlper" %>
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
UserControll
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Msg"])%></h2>
<div>
<% Html.RenderPartial("_allcimbs", ViewData["Climbs"]); %>
</div>
<% = Html.GetWelcomes(new WelcomeParam {
Lan="cn",
Name="sulin"
}
) %>
</script>
</asp:Content>
调用局部视图:Climb.aspx
<%@ Import Namespace="MvcTest.Models" %>
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Climb>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Climb
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Model.Name %></h2>
<div style=" float:left ; 80%">
Nmae:<%= Model .Name %>
Length:<%= Model .Length %>
Alittude:<%= Model .Gain %>
Average Grade :<%= Model .AveageGrade %>
</div>
<div style="float:left ; 80%">
<% Html.RenderPartial("_allcimbs", ViewData["Climbs"]); %>
</div>
</asp:Content>
调用局部视图到视图中还有一种写法:
Controller:
public ActionResult _AllClimbs()
{
var _reposiotry = new ClimbRepository();
var climbs = _reposiotry.GetTopclimbs();
return PartialView(climbs);
}
View这样调用:
<% Html.RenderPartial("_AllClimbs"); %>