作为ASP.NET MVC的新手,我一直想知道Controller方法的签名.在我看过的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例.
这是一个常见的例子:
public ActionResult Index()
{
return this.View();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将方法声明为public ViewResult Index()
并获得更强的类型支持是不是更有意义?
实验表明这是有效的,所以似乎有可能.
我确实意识到可能存在需要多态的情况(例如,如果你只想在某些情况下重定向,但在其他情况下显示视图),但如果方法总是返回一个视图,我会发现更多的ViewResult可取的.
就未来的兼容性而言,ActionResult显然提供了更强大的签名,但如果有人控制整个代码库,则总是可以将方法的签名更改为更通用的返回类型(如果将来需要它).
是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?
我创建了一个MVC项目,我想从过滤器中将模型设置为View.
但我不知道,我怎么能这样做.
该模型:
public class TestModel
{
public int ID { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Contorller:
[CustomFilter(View = "../Test/Test")]//<===/Test/Test.cshtml
public ActionResult Test(TestModel testModel)//<===Model from Page
{
//the Model has Value!!
// if has some exception here
return View(model);//<=====/Test/Test.cshtml
}
Run Code Online (Sandbox Code Playgroud)
过滤器(只是演示):
public override void OnActionExecuting(ActionExecutingContext filterContext){
ViewResult vr = new System.Web.Mvc.ViewResult()
{
ViewName = this.View,//<======/Test/Test.cshtml
ViewData = filterContext.Controller.ViewData
};
//How can I set Model here?!!
vr.Model = ???? //<========the Model is only get
filterContext.Result …
Run Code Online (Sandbox Code Playgroud) 在决定从Controller Action返回哪个ActionResult时,我决定使用三元运算符而不是更长的if-else.这是我的问题......
这段代码有效
return
ModelState.IsValid ?
(ActionResult) RedirectToAction("Edit", new { id = id }) :
View(new EditViewModel(updatedCategory));
Run Code Online (Sandbox Code Playgroud)
但事实并非如此
return
ModelState.IsValid ?
RedirectToAction("Edit", new { id = id }) :
View(new EditViewModel(updatedCategory));
Run Code Online (Sandbox Code Playgroud)
如果使用if-else,我不必进行显式转换.另外,RedirectToAction()和View()都返回一个ActionResult衍生物.
我喜欢这段代码的简洁性,但是这个代码似乎并不合适.任何人都可以开导我吗?
虽然我确定这很明显,但EditViewModel是我的Edit动作的视图模型,updatedCategory是EF4对象.但我不认为这与这个问题有关.
好的...我刚刚意识到我在做什么是不必要的,因为无论我是回到使用updatedCategory的Edit操作,所以我不需要确保模型有效.如果有人能提供帮助,我仍然很想知道这个问题的答案.
我正在尝试为 MVC 应用程序编写单元测试。我试图测试我的控制器是否返回正确的视图名称。
这是我测试的控制器操作:
public IActionResult Index(string reportcode)
{
if(string.IsNullOrEmpty(reportcode))
ReportCode = reportcode;
ViewBag.GridSource = GetReportData(reportcode);
return View("Index");
}
Run Code Online (Sandbox Code Playgroud)
这是我的单元测试:
[Test]
public void Index_ReturnCorrectView()
{
var controller = new HomeController();
var result = controller.Index("COMD") as ViewResult;
Assert.AreEqual("Index", result.ViewName);
}
Run Code Online (Sandbox Code Playgroud)
我从单元测试中得到的错误预期为“Index”,但为空。我做了很多搜索,大多数答案都说 ViewName 属性应该在返回视图时声明它之后设置。我尝试了同样的方法,但仍然无法正常工作。
谢谢
asp.net-mvc ×4
viewresult ×4
actionresult ×2
c# ×1
filter ×1
model ×1
polymorphism ×1
unit-testing ×1