本文将为您提供关于asp.net-mvc–T4MVC@Url.Action(MVC.Controller.Action())渲染“?Area=”QueryString中的参数的详细介绍,同时,我们还将
本文将为您提供关于asp.net-mvc – T4MVC @ Url.Action(MVC.Controller.Action())渲染“?Area =”QueryString中的参数的详细介绍,同时,我们还将为您提供关于ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值、ASP.NET MVC Controllers and Actions、ASP.NET MVC 中获取当前URL、controller、action图文实例、ASP.NET MVC 之controller 找不到action 的处理方式的实用信息。
本文目录一览:- asp.net-mvc – T4MVC @ Url.Action(MVC.Controller.Action())渲染“?Area =”QueryString中的参数
- ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值
- ASP.NET MVC Controllers and Actions
- ASP.NET MVC 中获取当前URL、controller、action图文实例
- ASP.NET MVC 之controller 找不到action 的处理方式
asp.net-mvc – T4MVC @ Url.Action(MVC.Controller.Action())渲染“?Area =”QueryString中的参数
@Html.Action(MVC.Menu.Index())
此操作决定要渲染哪个菜单。例如,一个公共菜单部分。在这些部分中,我也使用T4MVC渲染链接:
<ul id="navHolder"> <li> <ul> <li><b>@Html.ActionLink("Welcome",MVC.Home.Index())</b> ...
由于某些原因,T4MVC提供的Urls最后包括“?Area =”:
<ul id="navHolder"> <li> <ul> <li><b><a href="/home/index?Area=">Welcome</a></b> ...
我的项目中没有任何区域,我已将“IncludeAreasToken”设置设置为false。奇怪的是,只有当我使用“@ Html.Action”渲染部分时,才会发生这种情况 – 如果我将其作为“@ Html.Partial”拉入,则该参数不会被渲染,并且链接是干净和正确的。 (我不想把它作为一个部分,所以请不要提出这个建议;)
之前有任何人会遇到这个吗?
解决方法
@Html.ActionLink("Welcome","Index","Home",new { Area = "" },null)
在常规视图中,这不会产生虚假的区域=,而在一个Html.Action调用它。我需要问团队的人。
现在,您可以通过在t4mvc.tt中删除此行(围绕第310行)解决方法:
<# if (MvcVersion >= 2) { #>result.RouteValueDictionary.Add("Area",area ?? "");<# } #>
ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值
用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器。最近才发现IActionFilter的OnActionExecuting方法,甚至可以获取Controller的Action方法参数值。
假如我们在ASP.NET Core MVC项目中有一个HomeController,其中有一个Action方法叫Login,该方法有一个LoginLogoutRequest类型的参数,注意我们在Login上注册了我们后面会讲解的MyActionFilter拦截器:
public class HomeController : Controller
{
[MyActionFilter]
[HttpPost]
public IActionResult Login([FromBody]LoginLogoutRequest loginLogoutRequest)
{
return View();
}
}
其参数LoginLogoutRequest类的定义如下:
public class LoginLogoutRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
那么我们可以定义一个IActionFilter拦截器叫MyActionFilter,在其OnActionExecuting方法中,来获取HomeController中Action方法Login的参数LoginLogoutRequest:
public class MyActionFilterAttribute : Attribute, IActionFilter
{
/// <summary>
/// OnActionExecuting方法在Controller的Action执行前执行
/// </summary>
public void OnActionExecuting(ActionExecutingContext context)
{
//循环获取在Controller的Action方法中定义的参数
foreach (var parameter in context.ActionDescriptor.Parameters)
{
var parameterName = parameter.Name;//获取Action方法中参数的名字
var parameterType = parameter.ParameterType;//获取Action方法中参数的类型
//判断该Controller的Action方法是否有类型为LoginLogoutRequest的参数
if (parameterType == typeof(LoginLogoutRequest))
{
//如果有,那么就获取LoginLogoutRequest类型参数的值
var loginLogoutRequest = context.ActionArguments[parameterName] as LoginLogoutRequest;
var username = loginLogoutRequest.Username;
var password = loginLogoutRequest.Password;
}
}
}
/// <summary>
/// OnActionExecuted方法在Controller的Action执行后执行
/// </summary>
public void OnActionExecuted(ActionExecutedContext context)
{
//TODO
}
}
可以看到在IActionFilter的OnActionExecuting方法中,通过很简单的代码,我们就可以获取到Login方法参数LoginLogoutRequest的值。
ASP.NET MVC Controllers and Actions
ASP.NET MVC Controllers and Actions
MVC应用程序里的URL请求是通过控制器Controller处理的,不管是请求视图页面的GET请求,还是传递数据到服务端处理的Post请求都是通过Controller来处理的,先看一个简单的Controlller:

public class DerivedController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Hello from the DerivedController Index method"; //动态数据
return View("MyView"); //指定返回的View
}
}

是个DerivedController,那么对应处理的URL就是这样的:localhost:1042/Derived/Index,并且Index这个Action指定了返回的视图是MyView,而不是同名的Index视图,那么就需要新建一个视图MyView。在Index这个Action方法内右键 - 添加视图 - MyView,或者在解决方案的Views目录下新建一个Derived目录,再右键 - 新建视图 - MyView:

@{
ViewBag.Title = "MyView";
}
<h2>
MyView</h2>
Message: @ViewBag.Message

直接Ctrl+F5运行程序浏览器定位到的url是:localhost:1042,看看路由的定义:
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
注意路由的最后一行:new { controller = "Home", action = "Index", id = UrlParameter.Optional }
都给默认值了,那么URL:localhost:1042 其实就是:localhost:1042/Home/Index id是可选参数。
localhost:1042/Home/Index这个Url找的Controller自然是HomeController,Index对应的是HomeController下的Index这个Action,显然没有HoomeController,自然会报404错。
解决方法:
1.把路由的默认值修改成:
new { controller = "Derived", action = "Index", id = UrlParameter.Optional }
2.在浏览器的url栏里手动输入:localhost:1042/Derived/index
可以通过上下文对象Context取一些参数:
string userName = User.Identity.Name;
string serverName = Server.MachineName;
string clientIP = Request.UserHostAddress;
DateTime dateStamp = HttpContext.Timestamp;
跟普通的WebForm里一样,可以通过Request.Form接收传递过来的参数:
string oldProductName = Request.Form["OldName"];
string newProductName = Request.Form["NewName"];
取URL里/路由的参数:
string city = RouteData.Values["city"].ToString();
给Controller传参:

public ActionResult ShowWeatherForecast(string city, DateTime forDate)
{
ViewBag.City = city;
ViewBag.ForDate = forDate;
return View();
}

对应的a标签是这样的:
@Html.ActionLink("查看天气(传参)", "ShowWeatherForecast", new { city = "北京", forDate = @DateTime.Now })
再添加对应的视图:
@{
Layout = null;
}
要查询的是:@ViewBag.City 的天气,查询的时间是:@ViewBag.ForDate
运行下程序ShowWeatherForecast视图就显示了:
要查询的是:北京 的天气,查询的时间是:2013/11/25 21:08:04
当然也可以不传参但是提供默认值:
@Html.ActionLink("查看天气(默认值) ", "ShowWeatherForecast", new { forDate = @DateTime.Now })
没有传city,看Controller:

public ActionResult ShowWeatherForecast(DateTime forDate, string city = "合肥")
{
ViewBag.City = city;
ViewBag.ForDate = forDate;
return View();
}

视图显示:
要查询的是:合肥 的天气,查询的时间是:2013/11/25 21:16:35
默认值已经起作用了。
控制器里获取路由数据:

public string Index()
{
string controller = (string)RouteData.Values["controller"];
string action = (string)RouteData.Values["action"];
return string.Format("Controller: {0}, Action: {1}", controller, action);
}

自然浏览器就会显示:Controller: Derived, Action: index
Action里实现跳转:
public void Index()
{
Response.Redirect("/Derived/ShowWeatherForecast");
}
使用Response.Redirect实现跳转还比较偏WebForm化,MVC里更应该这么跳转:
public ActionResult Index()
{
return new RedirectResult("/Derived/ShowWeatherForecast");
}
之前都是类似的Action都是Return的View这里却Return的却是RedirectResult,这就得看方法的返回值了,方法的返回值是ActionResult,并不仅仅是ViewResult,可以理解为ActionResult是ViewResult和RedirectResult等等的基类。
这里甚至可以直接返回视图文件的物理路径:
return View("~/Views/Derived/ShowWeatherForecast.cshtml");
常用的Action返回值类型有:
跳转到别的Action:
public RedirectToRouteResult Redirect() {
return RedirectToAction("Index");
}
上面的方法是跳转到当前Controller下的另外一个Action,如果要跳转到别的Controller里的Action:
return RedirectToAction("Index", "MyController");
返回普通的Text数据:
public ContentResult Index() {
string message = "This is plain text";
return Content(message, "text/plain", Encoding.Default);
}
返回XML格式的数据:

public ContentResult XMLData() {
StoryLink[] stories = GetAllStories();
XElement data = new XElement("StoryList", stories.Select(e => {
return new XElement("Story",
new XAttribute("title", e.Title),
new XAttribute("description", e.Description),
new XAttribute("link", e.Url));
}));
return Content(data.ToString(), "text/xml");
}

返回JSON格式的数据(常用):

[HttpPost]
public JsonResult JsonData() {
StoryLink[] stories = GetAllStories();
return Json(stories);
}

文件下载:

public FileResult AnnualReport() {
string filename = @"c:\AnnualReport.pdf";
string contentType = "application/pdf";
string downloadName = "AnnualReport2011.pdf";
return File(filename, contentType, downloadName);
}

触发这个Action就会返回一个文件下载提示:
返回HTTP状态码:

//404找不到文件
public HttpStatusCodeResult StatusCode() {
return new HttpStatusCodeResult(404, "URL cannot be serviced");
}
//404找不到文件
public HttpStatusCodeResult StatusCode() {
return HttpNotFound();
}
//401未授权
public HttpStatusCodeResult StatusCode() {
return new HttpUnauthorizedResult();
}

返回RSS订阅内容:

public RssActionResult RSS() {
StoryLink[] stories = GetAllStories();
return new RssActionResult<StoryLink>("My Stories", stories, e => {
return new XElement("item",
new XAttribute("title", e.Title),
new XAttribute("description", e.Description),
new XAttribute("link", e.Url));
});
}

触发这个Action就会浏览器机会显示:
本文源码
系列文章导航
ASP.NET MVC 中获取当前URL、controller、action图文实例
本文介绍如何在ASP.NET MVC 中获取当前URL、controller、action,请看下图
一、url的获取很简单,asp.net通用:
【1】获取 完整url (协议名+域名+虚拟目录名+文件名+参数)
string url=request.url.tostring();
【2】获取 虚拟目录名+页面名+参数:
string url=request.rawurl;
(或 string url=request.url.pathandquery;)
【3】获取 虚拟目录名+页面名:
string url=httpcontext.current.request.url.absolutepath;
(或 string url= httpcontext.current.request.path;)
【4】获取 域名:
string url=httpcontext.current.request.url.host;
【5】获取 参数:
string url= httpcontext.current.request.url.query;
【6】获取 端口:
request.url.port
二、当前controller、action的获取
routedata.route.getroutedata(this.httpcontext).values["controller"]
routedata.route.getroutedata(this.httpcontext).values["action"]
或
mvc母版页routedata.values["controller"]
mvc母版页routedata.values["action"]
如果在视图中可以用
viewcontext.routedata.route.getroutedata(this.context).values["controller"]
viewcontext.routedata.route.getroutedata(this.context).values["action"]
或
viewcontext.routedata.values["controller"]
viewcontext.routedata.values["action"]
以上就是ASP.NET MVC 中获取当前URL、controller、action图文实例的详细内容,更多请关注php中文网其它相关文章!
ASP.NET MVC 之controller 找不到action 的处理方式
如果ActionInvoker找不到对应的action,默认会运行contorller类的HandleUnknownAction。而HandleUnknownAction会响应默认HTTP 404
在 asp.net MVC 里面 所有的controller 默认都继承于 System.Web.Mvc.Controller这个类,由于在System.Web.Mvc.Controller里HandleUnknownAction被标注了virtual ,所以 这个方法是可以替换的。
即我们可以自己重写HandleUnknownAction
using mytest2.DBContext;
using mytest2.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace mytest2.Controllers
{
public class guestsController : Controller
{
//
// GET: /guests/
public ActionResult Guest()
{
mytestContext db = new mytestContext();
guests guest = db.guests.FirstOrDefault();
return View(guest);
}
[HttpPost]
public ActionResult Guest(guests guests)
{
if(ModelState.IsValid)
{
return Content("success");
}
else
{
if(string.IsNullOrEmpty(guests.name))
{
ModelState.AddModelError("name","姓名不能为空");
}
}
return View();
}
protected override void HandleUnknownAction(string actionName)
{
Response.Redirect("https://www.baidu.com/");
}
}
}
这样 就在我们找不到action的时候 跳转到百度去
我们今天的关于asp.net-mvc – T4MVC @ Url.Action(MVC.Controller.Action())渲染“?Area =”QueryString中的参数的分享就到这里,谢谢您的阅读,如果想了解更多关于ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值、ASP.NET MVC Controllers and Actions、ASP.NET MVC 中获取当前URL、controller、action图文实例、ASP.NET MVC 之controller 找不到action 的处理方式的相关信息,可以在本站进行搜索。
本文标签: