<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ASP.NET MVC进阶课程 &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/zh/category/c-zh/asp-net-mvc%E8%BF%9B%E9%98%B6%E8%AF%BE%E7%A8%8B/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>独立软件开发工作室</description>
	<lastBuildDate>Mon, 28 Sep 2026 03:14:57 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://www.foxdevelop.com/wp-content/uploads/2026/05/fox-svgrepo-com-1.png</url>
	<title>ASP.NET MVC进阶课程 &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>视图和过滤器</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/%e8%a7%86%e5%9b%be%e5%92%8c%e8%bf%87%e6%bb%a4%e5%99%a8-2/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/%e8%a7%86%e5%9b%be%e5%92%8c%e8%bf%87%e6%bb%a4%e5%99%a8-2/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:14:56 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13126</guid>

					<description><![CDATA[17-部分视图动态改变 部分视图，允许我们动态改变视图里面的 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">17-部分视图动态改变</h3>



<p class="wp-block-paragraph">部分视图，允许我们动态改变视图里面的部分内容。</p>



<p class="wp-block-paragraph">这节的内容在基础课中，我们已经介绍过了，这里为了节省时间，我们也就不再重复讲了，感兴趣的同学可以访问下面地址</p>



<p class="wp-block-paragraph"><a href="http://www.foxdevelop.com/course/volume/1263">http://www.FoxDevelop.com/course/volume/1263</a></p>



<p class="wp-block-paragraph">之所以在进阶课程中再次提出来，是因为这个功能在一些管理页面后台可能会用到。</p>



<h3 class="wp-block-heading">18-_ViewStart.cshtml的作用</h3>



<p class="wp-block-paragraph">_viewstart.cshtml 这个视图文件，对于很多人来说，好像很少存在感，但是其实它却是我们所有的视图都受它影响。</p>



<p class="wp-block-paragraph">这个视图，也是就是所有的框架定死了，所有的视图（正常的action视图，不包括布局和部分视图）在加载前都先加载它</p>



<p class="wp-block-paragraph">这个视图主要目的是指定布局页</p>



<p class="wp-block-paragraph">所以如果的action视图其实如果用的就是</p>



<p class="wp-block-paragraph">viewstart里面的layout视图，那么我们可以不写的</p>



<p class="wp-block-paragraph">但是如果我们的action视图不想使用视图，那么就必须把layout设为null，否则还是使用viewstart里面的视图。</p>



<h3 class="wp-block-heading">19-[AllowAnonymous]的使用</h3>



<p class="wp-block-paragraph">这个标注主要是用来是的某些action不需要验证都可以访问，意思就是允许匿名访问</p>



<p class="wp-block-paragraph">比如我们现在有一个admincontroller的控制器，那么限制了它authorite的role</p>



<p class="wp-block-paragraph">那么如果我们希望里面的login 和register是允许匿名访问的，那么我们就可以使用这个标注来让这两个匿名action允许访问。</p>



<h3 class="wp-block-heading">20-Error.cshtml视图的使用</h3>



<p class="wp-block-paragraph">我们在开发的过程，不排除有一些时候会有错误，这个时候，我们就可以添加一些错误提示页面</p>



<p class="wp-block-paragraph">我们添加一个Error.cshtml错误页</p>



<p class="wp-block-paragraph">然后定义如下</p>



<h4 class="wp-block-heading">错误页代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-xml">@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Error";
}

<span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-danger"</span>&gt;</span>Error.<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h2</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-danger"</span>&gt;</span>An error occurred while processing your request.<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

@Model.Exception</code></span></pre>


<h4 class="wp-block-heading">调用方式</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">return</span> View(<span class="hljs-string">"Error"</span>);</code></span></pre>


<p class="wp-block-paragraph">或者</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">return</span> View(<span class="hljs-string">"Error"</span>,<span class="hljs-keyword">new</span> HandleErrorInfo(<span class="hljs-keyword">new</span> Exception(<span class="hljs-string">"ddddd"</span>),<span class="hljs-keyword">this</span>.GetType().ToString(),<span class="hljs-string">"Index"</span>));</code></span></pre>


<h3 class="wp-block-heading">21-ASP.NET MVC过滤器Filter的使用</h3>



<p class="wp-block-paragraph">自定义Filter需要继承ActionFilterAttribute抽象类，重写其中需要的方法</p>



<p class="wp-block-paragraph">比如我们做一个来路过滤器，判断访问我们的action地址的来路，如果是某个网站的来路 那么我们就禁止访问</p>



<h4 class="wp-block-heading">过滤器代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public override <span class="hljs-keyword">void</span> OnActionExecuting(ActionExecutingContext filterContext)
        {
        }</code></span></pre>


<p class="wp-block-paragraph">然后在使用的action加上标注</p>


<pre class="wp-block-code"><span><code class="hljs language-php">&#91;CheckRefere]　　<span class="hljs-comment">//此处为自定义属性，要引用相应的命名空间</span>
        <span class="hljs-keyword">public</span> ActionResult Index()
        {
            <span class="hljs-keyword">return</span> View();
        }</code></span></pre>


<p class="wp-block-paragraph">当然我们也可以在过滤器类里面加一个属性</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public string Message { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }</code></span></pre>


<p class="wp-block-paragraph">然后我们就可以使用这个参数了</p>


<pre class="wp-block-code"><span><code class="hljs language-json">&#91;CheckRefere(Message=<span class="hljs-string">"来路不明"</span>)]</code></span></pre>


<h4 class="wp-block-heading">全局过滤器</h4>



<p class="wp-block-paragraph">全局过滤器，顾名思义就是所有的action都起作用的过滤器</p>



<p class="wp-block-paragraph">我们可以在Global.asax中注册</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FilterConfig</span>
    </span>{
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(<span class="hljs-keyword">new</span> HandleErrorAttribute());
        }
    }</code></span></pre>


<h3 class="wp-block-heading">22-ASP.NET MVC中分页的封装</h3>



<p class="wp-block-paragraph">我们知道，我们很多页面都需要用到分页，那么作为MVC，我们可以吧分页条做成一个部分视图，这样可以方便我们多处调用</p>



<p class="wp-block-paragraph">其实想要实现分页</p>



<p class="wp-block-paragraph">我们只需要得到几个值就可以了</p>



<h4 class="wp-block-heading">分页视图代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">@{
    <span class="hljs-keyword">var</span> records = (int)ViewBag.Total;
    <span class="hljs-keyword">var</span> rows = (int)ViewBag.Rows;
    <span class="hljs-keyword">var</span> pages = records / rows == <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> : (records % rows == <span class="hljs-number">0</span> ? records / rows : records / rows + <span class="hljs-number">1</span>);
    <span class="hljs-keyword">var</span> currentPage = (int)ViewBag.CurrentPage;
    <span class="hljs-keyword">var</span> startPage = pages &gt; <span class="hljs-number">10</span> ? (currentPage &lt;= <span class="hljs-number">6</span> ? <span class="hljs-number">1</span> : currentPage - <span class="hljs-number">5</span>) : <span class="hljs-number">1</span>;
    <span class="hljs-keyword">var</span> endPage = pages &gt; <span class="hljs-number">10</span> ? (currentPage &lt;= <span class="hljs-number">6</span> ? <span class="hljs-number">11</span> : currentPage + <span class="hljs-number">5</span>) : pages;
    <span class="hljs-keyword">if</span> (endPage &gt; pages)
    {
        endPage = pages;
        startPage = endPage - <span class="hljs-number">10</span>;
    }
    <span class="hljs-keyword">var</span> keyParam = (string)ViewBag.KeyParam;
}</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/%e8%a7%86%e5%9b%be%e5%92%8c%e8%bf%87%e6%bb%a4%e5%99%a8-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Scripts和Style</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/scripts%e5%92%8cstyle/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/scripts%e5%92%8cstyle/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:12:44 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13123</guid>

					<description><![CDATA[14-ASP.NET MVC中使用Json MVC框架已经帮 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">14-ASP.NET MVC中使用Json</h3>



<p class="wp-block-paragraph">MVC框架已经帮我们封装好了使用json的功能</p>



<p class="wp-block-paragraph">很多前端的框架都是使用了json</p>



<p class="wp-block-paragraph">下面我们来把一个对象以jsonresult的方式返回来，然后再url中，我可以看到浏览器可以把它解析为一个json对象。</p>



<p class="wp-block-paragraph">easyui 和一些jquery框架目前都是使用json作为数据源的。</p>



<h4 class="wp-block-heading">控制器代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> JsonResult LoadData()
        {
            <span class="hljs-keyword">List</span>&lt;Notic&gt; <span class="hljs-keyword">list</span> = <span class="hljs-keyword">new</span> <span class="hljs-keyword">List</span>&lt;Notic&gt;();

            <span class="hljs-keyword">for</span> (int i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">20</span>; i++)
            {
                <span class="hljs-keyword">var</span> notic = <span class="hljs-keyword">new</span> Notic();
                notic.AfTime = DateTime.Now;
                notic.EffTime = DateTime.Now;
                notic.Title = <span class="hljs-string">"FoxDevelop"</span>;
                <span class="hljs-keyword">list</span>.Add(notic);
            }


            <span class="hljs-keyword">return</span> Json(<span class="hljs-keyword">list</span>, JsonRequestBehavior.AllowGet);
        }</code></span></pre>


<h3 class="wp-block-heading">15-MVC中对权限的控制</h3>



<p class="wp-block-paragraph">大型的MVC权限管理，需要用到mvc的过滤器，然后对访问者的权限进行对比判断。然后会分得更细。</p>



<p class="wp-block-paragraph">我们这里是将MVC提供的权限控制。</p>



<p class="wp-block-paragraph">通常我们要限制某个控制器或者控制器里面的某个action需要含有某个角色才能访问，那么这个时候，我们就可以给这个控制器或者action添加一个标注</p>


<pre class="wp-block-code"><span><code class="hljs language-json">&#91;Authorize(Roles = <span class="hljs-string">"admin"</span>)]</code></span></pre>


<p class="wp-block-paragraph">这样只要有admin这个角色的用户才能访问这个控制器下面的action或者某个action</p>



<p class="wp-block-paragraph">如果没有的话，那么就会调整到</p>



<h3 class="wp-block-heading">16-Scripts.Render和Style.Render的使用</h3>



<p class="wp-block-paragraph">这两个方法是用来在视图中加载一些js或者css到视图中。</p>



<p class="wp-block-paragraph">通常我们需要先注册规则。</p>



<p class="wp-block-paragraph">在Application_Start中我们注册</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">BundleConfig</span><span class="hljs-selector-class">.RegisterBundles</span>(<span class="hljs-selector-tag">BundleTable</span><span class="hljs-selector-class">.Bundles</span>);</code></span></pre>


<p class="wp-block-paragraph">然后我们注册需要的规则</p>



<p class="wp-block-paragraph">假设我们现在需要引入一些js</p>



<p class="wp-block-paragraph">这些js有一定的规则比如</p>



<p class="wp-block-paragraph">jbamn.ok.js</p>



<p class="wp-block-paragraph">jbamn.yes.js</p>



<p class="wp-block-paragraph">jbamn.no.js</p>



<p class="wp-block-paragraph">还有引入一下css</p>



<p class="wp-block-paragraph">bamn.haha.css</p>



<p class="wp-block-paragraph">bamn.front.css</p>



<p class="wp-block-paragraph">那么我们可以添加注册规则</p>


<pre class="wp-block-code"><span><code class="hljs language-php">bundles.Add(<span class="hljs-keyword">new</span> ScriptBundle(<span class="hljs-string">"~/bundles/bamn"</span>).<span class="hljs-keyword">Include</span>(
                      <span class="hljs-string">"~/Scripts/jbamn.ok.js"</span>,
                      <span class="hljs-string">"~/Scripts/jbamn.yes.js"</span>,<span class="hljs-string">"~/Scripts/jbamn.front.js"</span>));

            bundles.Add(<span class="hljs-keyword">new</span> StyleBundle(<span class="hljs-string">"~/Content/css/bamn"</span>).<span class="hljs-keyword">Include</span>(
                      <span class="hljs-string">"~/Content/bamn.ok.css"</span>,
                      <span class="hljs-string">"~/Content/bamn.front.css"</span>));</code></span></pre>


<p class="wp-block-paragraph">通常为了区别。js通常都是&#8221;~/bundles/xxxx&#8221;</p>



<p class="wp-block-paragraph">其实向我们这里的js是有规则的所以，我们完全可以这样写</p>


<pre class="wp-block-code"><span><code class="hljs language-php">bundles.Add(<span class="hljs-keyword">new</span> ScriptBundle(<span class="hljs-string">"~/bundles/bamn"</span>).<span class="hljs-keyword">Include</span>(
                        <span class="hljs-string">"~/Scripts/jbamn.*"</span>));</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/scripts%e5%92%8cstyle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DisplayTemplates和自定义标注</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/displaytemplates%e5%92%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%87%e6%b3%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/displaytemplates%e5%92%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%87%e6%b3%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:09:30 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13118</guid>

					<description><![CDATA[11-DisplayTemplates的使用 通过配置sho ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">11-DisplayTemplates的使用</h3>



<p class="wp-block-paragraph">通过配置showfordisply可以让某些字段是否呈现</p>



<p class="wp-block-paragraph">在Html中可以使用displayformodel来显示某些字段。</p>



<h4 class="wp-block-heading">显示模板示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-xml">@model DateTime
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>@ViewData.ModelMetadata.DisplayName:<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>@Model<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></span></pre>


<h3 class="wp-block-heading">12-重写ASP.NET MVC视图引擎实现换主题功能</h3>



<p class="wp-block-paragraph">我们可以重写一个我们自己的视图引擎，这样可以加载不同文件夹下面的视图模板</p>



<p class="wp-block-paragraph">这样就可以达到更换视图的效果</p>



<p class="wp-block-paragraph">写一个类型 继承BuildManagerViewEngine</p>



<p class="wp-block-paragraph">比如ThemeViewEngine</p>



<p class="wp-block-paragraph">然后构造函数 我们传入一个主题目录的文件夹 这样就可以动态改变视图文件夹了</p>



<p class="wp-block-paragraph">我们在gloable文件夹里面</p>



<p class="wp-block-paragraph">通过clear去掉原来的视图引擎，然后注册我们自己的视图引擎</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">ViewEngines</span><span class="hljs-selector-class">.Engines</span><span class="hljs-selector-class">.Clear</span>();
<span class="hljs-selector-tag">ViewEngines</span><span class="hljs-selector-class">.Engines</span><span class="hljs-selector-class">.Add</span>(<span class="hljs-selector-tag">new</span> <span class="hljs-selector-tag">ThemeViewEngine</span>("主题文件夹名称", <span class="hljs-selector-tag">null</span>));</code></span></pre>


<h3 class="wp-block-heading">13-自定义验证标注包括前端和服务器</h3>



<p class="wp-block-paragraph">验证标注借助jquery的验证框架来实现前端验证，后端验证的话，是在C#代码里面去实现。</p>



<p class="wp-block-paragraph">我们下面以一个勾选框为例子，我们自定义一个checkboxrequired标注，在这个标注中如果选择isRequire为true，那么就是用户不需勾选了才能提交。</p>



<p class="wp-block-paragraph">这个标注适合一些阅读责任书的地方</p>



<p class="wp-block-paragraph">添加一个标注类</p>



<p class="wp-block-paragraph">因为不是用来呈现控件，所以我们只需要继承</p>


<pre class="wp-block-code"><span><code class="hljs">public class CheckBoxRequiredAttribute : ValidationAttribute, IClientValidatable</code></span></pre>


<p class="wp-block-paragraph">这两个类和接口就可以了</p>



<p class="wp-block-paragraph">添加一个属性</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public bool IsChecked { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }</code></span></pre>


<p class="wp-block-paragraph">然后我们添加一个服务端验证方法</p>



<h4 class="wp-block-heading">服务器端验证方法</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> override bool IsValid(object value)
{
    <span class="hljs-keyword">if</span>(is)
    <span class="hljs-keyword">return</span> Convert.ToBoolean(value); 
}</code></span></pre>


<p class="wp-block-paragraph">然后再添加客户端方法</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    ModelClientValidationRule rule = <span class="hljs-keyword">new</span> ModelClientValidationRule
    {
        ValidationType = <span class="hljs-string">"ckrequired"</span>,
        ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()+<span class="hljs-string">"必须选择"</span>)
    };
    rule.ValidationParameters.Add(<span class="hljs-string">"ischecked"</span>, <span class="hljs-keyword">this</span>.Checked);
    <span class="hljs-keyword">yield</span> <span class="hljs-keyword">return</span> rule;
}</code></span></pre>


<p class="wp-block-paragraph">其中ValidationType 是验证的js方法名</p>



<p class="wp-block-paragraph">然后我们添加一个jquery.validate.custom.js的扩展方法</p>



<p class="wp-block-paragraph">这个是js的验证方法</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.validator.addMethod(<span class="hljs-string">"ckrequired"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value, element, param</span>) </span>{
    <span class="hljs-keyword">return</span> element.checked;
});
$.validator.unobtrusive.adapters.addSingleVal(<span class="hljs-string">"ckrequired"</span>, <span class="hljs-string">"ischecked"</span>);<span class="hljs-comment">//这个其实在这里用不到</span></code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/displaytemplates%e5%92%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%87%e6%b3%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>标注</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/%e6%a0%87%e6%b3%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/%e6%a0%87%e6%b3%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:05:24 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13117</guid>

					<description><![CDATA[09-自定义字段模板标注 上面，我们要想自定义模板的样式，需 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">09-自定义字段模板标注</h3>



<p class="wp-block-paragraph">上面，我们要想自定义模板的样式，需要写几个标注</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">&#91;UIHint(<span class="hljs-string">"DateBox"</span>)]
        &#91;Display(Name = <span class="hljs-string">"生效日期"</span>)]
        &#91;HiddenInput(DisplayValue = <span class="hljs-literal">false</span>)]
        public DateTime EffTime { <span class="hljs-keyword">set</span>; <span class="hljs-keyword">get</span>; }</code></span></pre>


<p class="wp-block-paragraph">那么其实我们完全可以自己封装一个标注的</p>



<h4 class="wp-block-heading">自定义日期控件标注</h4>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-attr">&#91;AttributeUsage(AttributeTargets.Property)]</span>
    <span class="hljs-selector-tag">public</span> <span class="hljs-selector-tag">abstract</span> <span class="hljs-selector-tag">class</span> <span class="hljs-selector-tag">DateBoxAttribute</span> : <span class="hljs-selector-tag">ValidationAttribute</span>, <span class="hljs-selector-tag">IClientValidatable</span>, <span class="hljs-selector-tag">IMetadataAware</span></code></span></pre>


<h4 class="wp-block-heading">前端验证</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> virtual IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            <span class="hljs-keyword">yield</span> <span class="hljs-keyword">break</span>;
        }</code></span></pre>


<h4 class="wp-block-heading">服务器端验证</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> override bool IsValid(object value)
        {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        }</code></span></pre>


<h4 class="wp-block-heading">添加元数据属性</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public virtual <span class="hljs-keyword">void</span> OnMetadataCreated(ModelMetadata metadata)
        {
            metadata.HideSurroundingHtml = <span class="hljs-literal">true</span>;
            metadata.TemplateHint = string.IsNullOrEmpty(<span class="hljs-keyword">this</span>.TemplateHint) ? <span class="hljs-keyword">this</span>.GetType().Name.Replace(<span class="hljs-string">"Attribute"</span>, string.Empty) : <span class="hljs-keyword">this</span>.TemplateHint;
                        metadata.DisplayName = <span class="hljs-keyword">this</span>.DisplayName;
            metadata.AdditionalValues.Add(<span class="hljs-string">"Style"</span>, <span class="hljs-keyword">this</span>.Style);

        }</code></span></pre>


<h4 class="wp-block-heading">重复标注说明</h4>



<p class="wp-block-paragraph">如果重复的标注的话，如果是附加属性，那么就会报错，如果不是那么以上面的为准</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">&#91;DateBox2(DisplayName = <span class="hljs-string">"生效日期2"</span>)]
        &#91;DateBox(Abc = <span class="hljs-string">"hahad"</span>,Cls = <span class="hljs-string">"csd"</span>,DisplayName = <span class="hljs-string">"生效日期"</span>,Width = <span class="hljs-number">124</span>)]
        public DateTime EffTime { <span class="hljs-keyword">set</span>; <span class="hljs-keyword">get</span>; }</code></span></pre>


<h3 class="wp-block-heading">10-字段视图中取得元数据</h3>



<p class="wp-block-paragraph">我们在字段添加的标注特性，其实都是为了字段的html呈现和字段的验证还有生成数据库。</p>



<p class="wp-block-paragraph">那么这节课，我们来讲解一下，如何在字段视图中取得附加特性和其他的特性。</p>



<h4 class="wp-block-heading">取得附加特性</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> width = ViewData.ModelMetadata.AdditionalValues&#91;<span class="hljs-string">"Width"</span>];</code></span></pre>


<h4 class="wp-block-heading">取得字段值</h4>



<p class="wp-block-paragraph">如果要在字段视图中取得字段的值的时候</p>



<p class="wp-block-paragraph">需要用到modelstate</p>



<p class="wp-block-paragraph">在视图中我们可以通过@Model 取得字段的值</p>



<p class="wp-block-paragraph">当然也可以用另外的方式来取得</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">ModelState modelState;
    ViewData.ModelState.TryGetValue(ViewData.ModelMetadata.PropertyName, out modelState);
    <span class="hljs-keyword">if</span> (modelState!=<span class="hljs-literal">null</span>)
    {
        <span class="hljs-keyword">var</span> str  = modelState.Value.AttemptedValue;
    }</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/%e6%a0%87%e6%b3%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>元数据</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/%e5%85%83%e6%95%b0%e6%8d%ae/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/%e5%85%83%e6%95%b0%e6%8d%ae/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:04:07 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13115</guid>

					<description><![CDATA[07-MVC的精髓-元数据 什么是元数据？ 元数据是视图模型 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">07-MVC的精髓-元数据</h3>



<p class="wp-block-paragraph">什么是元数据？</p>



<p class="wp-block-paragraph">元数据是视图模型的数据结构的描述对象。它是用来描述视图的模型字段。</p>



<p class="wp-block-paragraph">比如我们制定视图的@model 是Person 那么元数据就用来描述这个Person的一些属性。</p>



<p class="wp-block-paragraph">通过元数据我们可以取得字段的一些标注。有了这些标注，我们就可以呈现html 或者验证字段等</p>



<p class="wp-block-paragraph">我们在System.Web.Http.Metadata下面可以看到ModelMetadata的源码</p>



<p class="wp-block-paragraph">通过ViewData我们其实可以取得数据的元数据，元数据本身是一个树状的结构</p>



<p class="wp-block-paragraph">它有一个Properties属性，本身由是一个ModelMetadata 它用来描述这个字段的元数据。</p>



<h3 class="wp-block-heading">08-EditorTemplates字段模板的定义</h3>



<p class="wp-block-paragraph">我们使用EditorForModel的时候，可以使用一行代码，就可以把整个表单呈现出来</p>



<p class="wp-block-paragraph">但是如果我们想要给每个字段不一样的html表单控件的时候，就需要我们通过editorTemplates来指定每个字段使用不同的模型。</p>



<p class="wp-block-paragraph">下面我们就来试一下把我们的Notic来指定它的UIHint 它会对应一个模板cshtml</p>



<h4 class="wp-block-heading">了解 EditorForModel</h4>



<p class="wp-block-paragraph">它可以把整个表单呈现出来。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">form</span>&gt;</span>
    @Html.EditorForModel()
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span></code></span></pre>


<h4 class="wp-block-heading">ModelMetadata.HideSurroundingHtml 属性</h4>



<p class="wp-block-paragraph">隐藏环绕它的html代码</p>



<p class="wp-block-paragraph">当此属性与 DataAnnotationsModelMetadataProvider 模型元数据提供程序一起使用时，如果 HiddenInputAttribute 特性为 true 且 DisplayValue 属性设置为 false，则此属性设置为 true。</p>



<p class="wp-block-paragraph">当此属性设置为 false 时，EditorFor 方法将 HTML div 元素呈现为模型的容器，并将 label 元素呈现为模型的标题。 当此属性设置为 true 时，不会呈现 div 和 label 元素。 当模板生成隐藏的 input 元素时，通常会使用此属性。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/%e5%85%83%e6%95%b0%e6%8d%ae/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>06-HtmlHelper使用Lambda方式使用</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/06-htmlhelper%e4%bd%bf%e7%94%a8lambda%e6%96%b9%e5%bc%8f%e4%bd%bf%e7%94%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/06-htmlhelper%e4%bd%bf%e7%94%a8lambda%e6%96%b9%e5%bc%8f%e4%bd%bf%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:01:12 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13111</guid>

					<description><![CDATA[我们前面的日期控件，name字段都是直接传入字符串名称的，但 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">我们前面的日期控件，name字段都是直接传入字符串名称的，但是我们其实发现，mvc的一些HtmlHelper的带for的后缀的，比如@Html.PasswordFor</p>



<p class="wp-block-paragraph">那么这些带For后缀的和不带For后缀的有什么区别呢？</p>



<p class="wp-block-paragraph">带For后缀的，我们可以配合强类型视图模型来使用。</p>



<p class="wp-block-paragraph">我们通过@model LoginViewModel</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">@Html.TextBoxFor(<span class="hljs-function"><span class="hljs-params">m</span> =&gt;</span> m.Email, <span class="hljs-keyword">new</span> { @<span class="hljs-class"><span class="hljs-keyword">class</span> </span>= <span class="hljs-string">"form-control"</span> })
@Html.TextBox(<span class="hljs-string">"Email"</span>,<span class="hljs-string">"admin@FoxDevelop.com"</span>, <span class="hljs-keyword">new</span> { @<span class="hljs-class"><span class="hljs-keyword">class</span> </span>= <span class="hljs-string">"form-control"</span> })</code></span></pre>


<p class="wp-block-paragraph">这样的方式来完成表单的渲染</p>



<p class="wp-block-paragraph">下面我们就把上一节中的日期控件改造成Lambda的方式调用</p>



<h4 class="wp-block-heading">关键方法签名</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public <span class="hljs-keyword">static</span> MvcHtmlString TextBoxFor&lt;TModel, TProperty&gt;(<span class="hljs-keyword">this</span> HtmlHelper&lt;TModel&gt; htmlHelper, Expression&lt;Func&lt;TModel, TProperty&gt;&gt; expression, IDictionary&lt;string, object&gt; htmlAttributes)</code></span></pre>


<p class="wp-block-paragraph">ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);</p>



<p class="wp-block-paragraph">string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);</p>



<h4 class="wp-block-heading">实现代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">//要实现带for的这种 关键两部 就是得到字段的name 和 </span>
        public <span class="hljs-keyword">static</span> MvcHtmlString DickPicketFor&lt;TModel, TProperty&gt;(<span class="hljs-keyword">this</span> HtmlHelper&lt;TModel&gt; htmlHelper, Expression&lt;Func&lt;TModel, TProperty&gt;&gt; expression, object htmlAttributes)
        {
            <span class="hljs-comment">//取得元数据</span>
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

            <span class="hljs-comment">//取得字段的名称</span>
            string name = ExpressionHelper.GetExpressionText(expression);
            string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

            <span class="hljs-comment">//取得字段的值</span>
            object value = metadata.Model;

            <span class="hljs-keyword">var</span> dic = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

            TagBuilder tagBuilder = <span class="hljs-keyword">new</span> TagBuilder(<span class="hljs-string">"input"</span>);
            tagBuilder.MergeAttributes(dic);
            tagBuilder.MergeAttribute(<span class="hljs-string">"class"</span>, <span class="hljs-string">"Wdate"</span>);
            tagBuilder.MergeAttribute(<span class="hljs-string">"name"</span>, fullName, <span class="hljs-literal">true</span>);
            tagBuilder.MergeAttribute(<span class="hljs-string">"onClick"</span>, <span class="hljs-string">"WdatePicker({ el:this, dateFmt:'yyyy-MM-dd HH:mm:ss' })"</span>);
            <span class="hljs-keyword">return</span> tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing);
        }</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/06-htmlhelper%e4%bd%bf%e7%94%a8lambda%e6%96%b9%e5%bc%8f%e4%bd%bf%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MVC中自定义Html日期控件</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/mvc%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89html%e6%97%a5%e6%9c%9f%e6%8e%a7%e4%bb%b6/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/mvc%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89html%e6%97%a5%e6%9c%9f%e6%8e%a7%e4%bb%b6/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 03:00:43 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13110</guid>

					<description><![CDATA[04-MVC中自定义Html日期控件 微软官方意见提供了很多 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">04-MVC中自定义Html日期控件</h3>



<p class="wp-block-paragraph">微软官方意见提供了很多的HTML控件了，我们也可以自定义自己的HTML控件。这些控件可以是表单控件也可以是非表单控件。</p>



<p class="wp-block-paragraph">下面我们来自定义一个日期控件。</p>



<p class="wp-block-paragraph">日期控件，我们需要js的支持。所以我们找一个日期控件，我们这里选择My97DatePicker这款控件</p>



<p class="wp-block-paragraph">下载 <a href="http://www.my97.net/down/My97DatePicker.zip">http://www.my97.net/down/My97DatePicker.zip</a></p>



<h4 class="wp-block-heading">视图调用示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">@Html.DickPicket(<span class="hljs-string">"effict"</span>,<span class="hljs-string">"生效时间"</span>);
@Html.DickPicket(<span class="hljs-string">"act"</span>,<span class="hljs-string">"失效时间"</span>);</code></span></pre>


<h3 class="wp-block-heading">05-TagBuilder 创建HTML控件</h3>



<p class="wp-block-paragraph">我们上一节中创建HTML控件基本都是使用拼接html字符串的方式。这种方式有好也有坏。坏的地方就是阅读不方便。为此微软提供了一个创建HTML标记的类TagBuilder，它可以以类对象的方式来创建HTML代码。</p>



<p class="wp-block-paragraph">下面我们还是以上一节课的例子来把日期控件通过TagBuilder的方式创建出来。</p>



<h4 class="wp-block-heading">扩展方法代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public <span class="hljs-keyword">static</span> MvcHtmlString DickPicket(<span class="hljs-keyword">this</span> HtmlHelper htmlHelper, string name)
        {
            TagBuilder tagBuilder = <span class="hljs-keyword">new</span> TagBuilder(<span class="hljs-string">"input"</span>);
            tagBuilder.MergeAttribute(<span class="hljs-string">"class"</span>, <span class="hljs-string">"Wdate"</span>);
            tagBuilder.MergeAttribute(<span class="hljs-string">"name"</span>, name);
            tagBuilder.MergeAttribute(<span class="hljs-string">"onClick"</span>, <span class="hljs-string">"WdatePicker({ el:this, dateFmt:'yyyy-MM-dd HH:mm:ss' })"</span>);
            <span class="hljs-keyword">return</span> tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing);
        }</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/mvc%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89html%e6%97%a5%e6%9c%9f%e6%8e%a7%e4%bb%b6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>03-自定义HtmlHelper辅助方法</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/03-%e8%87%aa%e5%ae%9a%e4%b9%89htmlhelper%e8%be%85%e5%8a%a9%e6%96%b9%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/03-%e8%87%aa%e5%ae%9a%e4%b9%89htmlhelper%e8%be%85%e5%8a%a9%e6%96%b9%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 02:59:22 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13107</guid>

					<description><![CDATA[HtmlHelper是视图中的强大的帮助类。 在mvc中因为 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">HtmlHelper是视图中的强大的帮助类。</p>



<p class="wp-block-paragraph">在mvc中因为没有了webform的各种控件。但是MVC提供了各种HtmlHelper给我们使用。通过htmlhelper我们可以实现和创建各种东西。</p>



<p class="wp-block-paragraph">htmlhelper除了可以帮我们渲染页面控件外。还可以定义一些辅助方法。我们这集先来讲解一些辅助方法。</p>



<p class="wp-block-paragraph">如果要返回控件，则我们的htmlheper的方法要返回MvcHtmlString类型的值</p>



<p class="wp-block-paragraph">如果是辅助方法，我们可以返回字符串或者整数等类型。</p>



<p class="wp-block-paragraph">下面我们来试一下添加一个htmlhelper方法，目的是用来截取多少个字符串。末尾用&#8230;后缀。</p>



<h4 class="wp-block-heading">辅助方法代码</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">namespace WebApplication1.Cores
{
    public <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyHtmlHelper</span>
    </span>{
        public <span class="hljs-keyword">static</span> string CutString(<span class="hljs-keyword">this</span> HtmlHelper htmlHelper, string input, int length, string cur)
        {
            <span class="hljs-keyword">if</span> (string.IsNullOrEmpty(input))
            {
                <span class="hljs-keyword">return</span> string.Empty;
            }
            <span class="hljs-keyword">if</span> (input.Length&lt;=length)
            {
                <span class="hljs-keyword">return</span> input;
            }

            <span class="hljs-keyword">return</span> input.Substring(<span class="hljs-number">0</span>, length) + cur;
        }
    }
}</code></span></pre>


<h4 class="wp-block-heading">视图调用示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">@using WebApplication1.Cores

@{
    ViewBag.Title = <span class="hljs-string">"Index"</span>;
    Layout = <span class="hljs-string">"~/Views/Shared/_Layout.cshtml"</span>;
    <span class="hljs-keyword">var</span> title = <span class="hljs-string">"讲述MVC的基本使用。在进阶课程里面。我们可能涉及到很多底层的东西。希望同学们能够在这套课程中，学到更多的开发经验。和一些开发技巧。"</span>;
    
}

&lt;h2&gt;@ViewBag.Page&lt;/h2&gt;
@Html.CutString(title,<span class="hljs-number">12</span>,<span class="hljs-string">"..."</span>)</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/03-%e8%87%aa%e5%ae%9a%e4%b9%89htmlhelper%e8%be%85%e5%8a%a9%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>02-MVC路由应用</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/02-mvc%e8%b7%af%e7%94%b1%e5%ba%94%e7%94%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/02-mvc%e8%b7%af%e7%94%b1%e5%ba%94%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 02:58:43 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13106</guid>

					<description><![CDATA[ASP.NET MVC关键的一步就是路由配置了。 甚至有些时 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ASP.NET MVC关键的一步就是路由配置了。</p>



<p class="wp-block-paragraph">甚至有些时候路由决定了程序的难易程度。</p>



<p class="wp-block-paragraph">这节，我们讲解一下一些在项目中用到的常用路由配置。</p>



<p class="wp-block-paragraph">比如单页路由配置。比如我们希望我们的页面是<a href="http://www.xxxx.com/page/xxxx">http://www.xxxx.com/page/xxxx</a></p>



<p class="wp-block-paragraph">这个xxx可以让我们任意配置</p>



<p class="wp-block-paragraph">defaults: new { controller = &#8220;Home&#8221;,action=&#8221;Index&#8221;,page=&#8221;abc&#8221;, id = UrlParameter.Optional }</p>



<p class="wp-block-paragraph">也就是在Application_Start里面我们是先注册区域路由Area</p>



<p class="wp-block-paragraph">AreaRegistration.RegisterAllAreas();</p>



<p class="wp-block-paragraph">RouteConfig.RegisterRoutes(RouteTable.Routes);</p>



<p class="wp-block-paragraph">RouteData 必须包含名为“action”且值为非空字符串的项</p>



<p class="wp-block-paragraph">当有两个同名的controller的时候 需要制定namespace</p>



<p class="wp-block-paragraph">路由的先后顺序关系，特殊的路由要放上面。</p>



<p class="wp-block-paragraph">路由器中的命名空间使用，比如有些controller是放在其他的dll中的</p>



<p class="wp-block-paragraph">区域路由要放在上面。</p>



<p class="wp-block-paragraph">理解路由配置的五个参数 name url defaults constraints</p>



<p class="wp-block-paragraph">找到多个与名为“Page”的控制器匹配的类型。如果为此请求(“{page}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配的控制器，则会发生这种情况。如果是这样，请通过调用带有 &#8216;namespaces&#8217; 参数的 &#8220;MapRoute&#8221; 方法的重载来注册此路由。</p>



<p class="wp-block-paragraph">“Page”请求找到下列匹配的控制器:</p>



<p class="wp-block-paragraph">ClassLibrary1.PageController</p>



<p class="wp-block-paragraph">WebApplication1.Controllers.PageController</p>



<h4 class="wp-block-heading">路由配置代码示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute(<span class="hljs-string">"{resource}.axd/{*pathInfo}"</span>);

            <span class="hljs-comment">//http://xxx.com/</span>
            routes.MapRoute(
                 name: <span class="hljs-string">"Home"</span>,
                 <span class="hljs-attr">url</span>: <span class="hljs-string">""</span>,
                 <span class="hljs-attr">defaults</span>: <span class="hljs-keyword">new</span> { controller = <span class="hljs-string">"Home"</span>, action = <span class="hljs-string">"Index"</span>}
             );
            
            <span class="hljs-comment">//http://xxx.com/abc</span>
            <span class="hljs-comment">//http://xxx.com/ed</span>
            <span class="hljs-comment">//http://xxx.com/oka</span>

            routes.MapRoute(
                 name: <span class="hljs-string">"Page"</span>,
                 <span class="hljs-attr">url</span>: <span class="hljs-string">"{page}"</span>,
                 <span class="hljs-attr">defaults</span>: <span class="hljs-keyword">new</span> { controller = <span class="hljs-string">"Page"</span>, action = <span class="hljs-string">"Index"</span>, page = <span class="hljs-string">"abc"</span> },
                 <span class="hljs-attr">constraints</span>:<span class="hljs-keyword">new</span> {page=<span class="hljs-string">"&#91;a-z]+"</span> },
                 <span class="hljs-attr">namespaces</span>:<span class="hljs-keyword">new</span> string&#91;]{ <span class="hljs-string">"ClassLibrary1"</span>}
             );

            <span class="hljs-comment">//http://xxx.com/abc/sadf</span>
            <span class="hljs-comment">//http://xxx.com/abc/sadf/1</span>
            routes.MapRoute(
                name: <span class="hljs-string">"Default"</span>,
                <span class="hljs-attr">url</span>: <span class="hljs-string">"{controller}/{action}/{id}"</span>,
                <span class="hljs-attr">defaults</span>: <span class="hljs-keyword">new</span> { controller = <span class="hljs-string">"Home"</span>, action = <span class="hljs-string">"Index"</span>, id = UrlParameter.Optional }
            );
        }</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/02-mvc%e8%b7%af%e7%94%b1%e5%ba%94%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pageBaseType的使用</title>
		<link>https://www.foxdevelop.com/zh/2026/09/28/pagebasetype%e7%9a%84%e4%bd%bf%e7%94%a8/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/28/pagebasetype%e7%9a%84%e4%bd%bf%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 02:49:08 +0000</pubDate>
				<category><![CDATA[ASP.NET MVC进阶课程]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13104</guid>

					<description><![CDATA[通过重写pageBaseType我们可以在视图中调用我们自己 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">通过重写pageBaseType我们可以在视图中调用我们自己定义的方法属性等</p>



<p class="wp-block-paragraph">我们知道，我们操作视图，可以在视图中通过@来调用很多属性。</p>



<p class="wp-block-paragraph">但是其实这些属性方法，对于我们来说，其实还是完全不够的。我们其实可以通过重写pageBaseType类，这样我们就可以在我们的类里面添加我们自己的方法属性等</p>



<h5 class="wp-block-heading">实现步骤</h5>



<p class="wp-block-paragraph">1 在视图文件夹的web.config中 修改</p>



<p class="wp-block-paragraph"><code>&lt;system.web.webPages.razor&gt;</code>下面的</p>



<p class="wp-block-paragraph"><code>&lt;pages pageBaseType="xxxxx.Mvc.WebViewPageBase"&gt;</code></p>



<p class="wp-block-paragraph">2 然后我们定义一个我们自己的WebViewPageBase</p>



<p class="wp-block-paragraph">这个类要实现 <code>WebViewPage&lt;T&gt;</code></p>


<pre class="wp-block-code"><span><code class="hljs language-xml">public abstract class WebViewPageBase<span class="hljs-tag">&lt;<span class="hljs-name">T</span>&gt;</span> : WebViewPage<span class="hljs-tag">&lt;<span class="hljs-name">T</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">3 然后我们在我们自己的类里面就可以添加我们的属性，比如为了方便操作缓存，我们添加一个缓存属性帮助类</p>



<p class="wp-block-paragraph">添加属性</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/// &lt;summary&gt;</span>
        <span class="hljs-comment">/// 缓存</span>
        <span class="hljs-comment">/// &lt;/summary&gt;</span>
        protected Cache CacheHelper
        {
            <span class="hljs-keyword">get</span>
            {
                <span class="hljs-keyword">return</span> HttpRuntime.Cache;
            }
        }</code></span></pre>


<p class="wp-block-paragraph">然后我们在视图里面就可以调用了缓存 <code>@CacheHelper.Count</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/28/pagebasetype%e7%9a%84%e4%bd%bf%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
