我有两个方法的控制器:.NET MVC返回从控制器查看无模型
Index()
,加载从DB数据模型。GetFile()
,返回一个供用户下载的文件。
如果GetFile()
失败,我想返回视图,并带有errormessage。我不是从视图发送模型到控制器方法GetFile()。
我的问题是:
- 如果我想返回从的GetFile视图(),我将不得不初始化模式,并调用数据库的数据。在我看来,这是浪费资源,应该避免。
我的问题:有没有办法返回查看,而无需再次初始化模式(调用DB)
我有两个方法的控制器:.NET MVC返回从控制器查看无模型
Index()
,加载从DB数据模型。GetFile()
,返回一个供用户下载的文件。如果GetFile()
失败,我想返回视图,并带有errormessage。我不是从视图发送模型到控制器方法GetFile()。
我的问题是:
我的问题:有没有办法返回查看,而无需再次初始化模式(调用DB)
可以在View()
方法指定视图名称:
...
if(error)
{
return View("Error");
}
return View(model);
...
在这如果您必须在控制器视图文件夹或共享视图文件夹中包含Error.cshtml文件。在tahat视图中,您不需要定义模型。
您还可以使用TempData
发送错误信息重定向后,控制器:
...
if(error)
{
TempData["ErrorMessage"] = "Error";
return Redirect("Index");
}
return View(model);
...
然后在指数或布局视图:
...
<div class="error">@TempData["ErrorMessage"]</div>
...
如果你想呈现相同的观点,但没有模型,你有在使用模型之前检查模型是否为空。
...
if(Model != null)
{
//---display model
}
else
{
<div>Error message</div>
}
...
对我来说,最干净的解决方案是创建自定义对象来承载所有错误。 通过使用List和/或一个错误消息(例如,最终用户可理解的文本),可以使用该对象返回到视图,以显示错误。 这是具有多个字段,你可以,也许,以编辑填写您需要一个容器:
public class Container<T>
{
private List<Error> _errors;
private string _errorMessage;
private bool _hasErrors;
public T Value { get; set; }
public bool HasErrors
{
get
{
if (!_hasErrors && !string.IsNullOrEmpty(this.ErrorMessage))
{
_hasErrors = true;
}
return _hasErrors;
}
set
{
_hasErrors = value;
}
}
就这样,在视图中,你只需要检查,如果你的Model.hasError,否则,你可以使用Model.Value 。
牛逼可能是字符串,自定义对象,或任何你想要收藏列表...所以你可以使用它在整个项目
_“最干净的解决方案”_ - 不,你只是重建'ModelState'。解释为什么这是一个很好的解决方案,它为现有的错误处理和显示机制增添了什么。 – CodeCaster
如果我重定向到指数(),我errormessage的dissapear。
这就是为什么你应该使用TempData的:Difference Between ViewData and TempData?
在你的控制器:
TempData["ImportError"] = "Some error string";
return RedirectToAction("Index");
在索引视图:
@TempData["ImportError"]
我认为他不想加载索引(并调用DB)当有错误 – clement
@clement no,OP说:_“如果我重定向到Index(),我的错误消息消失如果我想返回到视图从GetFile(),我将不得不初始化模型并调用数据库。“_ OP不想再次显示'GetFile()'。 – CodeCaster
他还说__我想返回到相同的视图,但添加错误消息.__ – clement
您可以重定向到可以使用另一种观点只为显示错误, – Mairaj