我想在ASP.NET MVC中将ActionFilter应用到我的应用程序中的每个操作 - 在每个控制器上.
有没有办法在不将其应用于每个ActionResult方法的情况下执行此操作?
通常我在将数据提交到数据库之前在action方法中验证我的模型.
[HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
//commit changes to database...
return View("SuccessView",model);
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
但在一些非常罕见的情况下,我需要在提交模型时在业务层中执行一些额外的验证.如果发生验证错误,我想在业务层中引发异常并使用该异常返回带有验证错误的视图.
我正在寻找一种方法来实现它,而无需改变我的控制器中的任何代码.所以我正在寻找避免这种情况的方法:
[HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
try {
//commit changes to database...
} catch (ValidationException e){
ModelState.AddModelError(...);
return View(model);
}
return View("SuccessView",model);
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我正在考虑一个捕获ValidationExceptions的动作过滤器,并在常规[HandleError]
过滤器启动之前返回带有验证错误的合适视图.这样的事情可能吗?
编辑:我刚刚找到解决方案(见下文),但直到48小时后我才能将此标记为正确答案...
我想在ActionResult请求期间显示一个ajax加载图标,可能需要几秒钟才能处理.
完成此任务的最佳方法是什么?
我只想在构建验证通过后显示图标(我正在使用MVC3,EF Code First,因此验证会自动放在页面上).
在ActionResult期间可能还有进一步的验证/异常,在这种情况下会向用户显示一条消息,然后我想让加载图标再次消失.
谢谢!
我有一个在我的MVC应用程序中设置的会话变量.每当该会话到期并且用户尝试刷新它们所在的页面时,该页面将抛出错误,因为该会话不再设置.
在加载视图之前,我是否可以检查会话是否已设置?也许把东西放在Global.asax文件中?
我可以在每个ActionResult的开头做这样的事情.
public ActionResult ViewRecord()
{
if (MyClass.SessionName == null)
{
return View("Home");
}
else
{
//do something with the session variable
}
}
Run Code Online (Sandbox Code Playgroud)
这样做还有其他选择吗?在这种情况下,最佳做法是什么?
我有一个MVC网站,后面有C#代码.我正在使用一个返回Json的ActionResult.
我试图在ViewBag中放一些东西,但似乎不起作用.
代码看起来像这样 -
public ActionResult GetStuff(string id)
{
ViewBag.Id = id;
stuff = new StuffFromDatabase(id);
return this.Json(stuff , JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
"id"未出现在ViewBag.Id中.
我可以用这种方式将id放入ViewBag吗?如果没有关于我应该如何做的任何建议?谢谢!
我想从Url.Action传递多个参数,这是代码中的代码
window.location.href = "@Url.Action("ABC", "XYZ", new { @A= ViewBag.A , @B = ViewBag.B })";
Run Code Online (Sandbox Code Playgroud)
这是我在Controller XYZ中的方法
public ActionResult ABC(string A, string B)
{
// Some Code
}
Run Code Online (Sandbox Code Playgroud)
我总是只在第一个参数中得到值,第二个总是为空.要么我,要么B先.第二个总是空的.VIEW基本上属于JavaScript功能.这是URL:http://localhost/CargoMainSite/XYZ/ABC?A=1&B=2
请注意参数1和参数2之间有一些额外的文本,即"amp;" 如果我明确删除它.它工作正常,并获得适当的价值.
redirect
和redirectAction
Struts2.3上下文之间的主要区别是什么。
我在下面看到了用于redirect和redirectAction的 URL 。
我很清楚以下几点:
redirectAction
,控制跳到不同的动作(在相同或其他程序包中)redirectAction
建议不要通过重定向。但是,当我实现上述两个示例时,只需更改即可struts.xml
。
首先,我对Apache文档中关于以下内容的声明感到困惑 redirectAction
这比ServletRedirectResult更好,因为它不需要您将ActionMapper处理的URL模式编码到struts.xml配置文件中。这意味着您可以随时更改URL模式,并且您的应用程序仍然可以运行。强烈建议您如果要重定向到其他操作,请使用此结果,而不要使用标准重定向结果。
其次,我对两者之间的区别还不太清楚。
我正在编写简单的代理应用程序,它获取“URL 地址”,如“/xController/xMethod”,并通过 HttpClient 从另一个 Web 应用程序获取结果并显示结果。
我的方法:
public ActionResult Index(string urlAddress)
{
var data = "";
if (Request.ContentLength > 0 && httpRequestMessage != null)
data = httpRequestMessage.Content.ReadAsStringAsync().Result;
using (var client = new HttpClient())
{
// fill header and set target site url
// Make Post Data
var buffer = System.Text.Encoding.UTF8.GetBytes(data);
var byteContent = new ByteArrayContent(buffer);
if (!String.IsNullOrWhiteSpace(Request.ContentType) && !String.IsNullOrEmpty(Request.ContentType))
byteContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue(Request.ContentType);
// make query string ....
// sending request to target site
HttpResponseMessage response = null;
if (Request.HttpMethod.ToUpper() …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 IActionResult 接口来抛出特定的异常。但此刻我被困在控制器上。我编写了以下代码来获取单个调用:
[Route("singlecall")]
[HttpGet]
[ProducesResponseType(200, Type = typeof(Models.CallModel))]
[ProducesResponseType(404)]
public async Task<IActionResult> GetSingleCall([FromQuery]string callId, [FromQuery] string token)
{
CallModel singleCall = await CustomerPortalBC.CallManagementBusiness.CallService.GetSingleCall(new Guid(callId), new Guid(token));
if (singleCall == null){
return NotFound();
}
return singleCall;
}
Run Code Online (Sandbox Code Playgroud)
这将(显然)不起作用,因为我不能只返回 singleCall 对象。它需要一个 Microsoft.AspNetCore.Mvc.IActionResult。所以我确切地知道问题是什么,我只是不知道如何解决它。
任何见解或帮助将不胜感激!
我有这个签名的控制器方法:
public async IAsyncEnumerable<MyDto> Get()
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我需要做一些请求验证并相应地返回 401、400 和其他代码,但它不支持。或者,以下签名不会编译:
public async Task<ActionResult<IAsyncEnumerable<MyDto>>> Get()
Run Code Online (Sandbox Code Playgroud)
错误:
无法将类型“Microsoft.AspNetCore.Mvc.UnauthorizedResult”隐式转换为“MyApi.Responses.MyDto”
完整方法:
public async IAsyncEnumerable<MyDto> Get()
{
if (IsRequestInvalid())
{
// Can't do the following. Does not compile.
yield return Unauthorized();
}
var retrievedDtos = _someService.GetAllDtosAsync(_userId);
await foreach (var currentDto in retrievedDtos)
{
yield return currentDto;
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?似乎无法相信微软的设计目的IAsyncEnumerable
是在没有返回任何其他东西的可能性/灵活性的情况下使用。
c# actionresult request-validation asp.net-core-webapi iasyncenumerable
actionresult ×10
asp.net-mvc ×7
c# ×5
ajax ×1
apache ×1
asp.net ×1
httpclient ×1
javascript ×1
parameters ×1
redirect ×1
struts2 ×1
validation ×1
viewbag ×1