【问题标题】:.NET MVC Return to View from controller without model.NET MVC 从没有模型的控制器返回视图
【发布时间】:2015-05-04 07:48:46
【问题描述】:

我有一个控制器,有两种方法:

  • Index(),使用数据库中的数据加载模型。
  • GetFile(),返回一个文件供用户下载。

如果GetFile() 失败,我想返回视图,并显示错误消息。我没有将模型从视图发送到控制器方法 GetFile()。

我的问题是:

  • 如果我想从 GetFile() 返回到视图,我必须初始化模型并调用数据库获取数据。在我看来,这是一种资源浪费,应该避免。

我的问题:有没有办法返回视图,而无需再次初始化模型(调用 DB)

【问题讨论】:

  • 您可以重定向到另一个视图,该视图可能仅用于显示错误,

标签: asp.net-mvc


【解决方案1】:

您可以在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>
}
...

【讨论】:

  • 是的,这是可能的,但我想返回相同的视图但添加错误消息。
  • 我想补充一点,您可以将错误消息作为视图模型作为第二个参数提供,如下所示:return View("Error", "Something went wrong...");
  • 它有效。但是我想知道是否可以在不再次从数据库中获取数据的情况下返回模型视图(我希望它保存在内存中或其他东西中)。如果不将模型从视图发送到控制器,这似乎是不可能的
【解决方案2】:

如果我重定向到 Index(),我的错误消息就会消失。

这就是你应该使用 TempData 的原因:Difference Between ViewData and TempData?

在您的控制器中:

TempData["ImportError"] = "Some error string";
return RedirectToAction("Index");

在您的索引视图中:

@TempData["ImportError"]

【讨论】:

  • 我认为他不想在出现错误时加载索引(并调用数据库)
  • @clement no,OP 说:“如果我重定向到 Index(),我的错误消息就会消失。如果我想从 GetFile() 返回到视图,我将不得不初始化模型并调用数据库获取数据。" OP 不想再次显示GetFile()
  • 他还说我想回到同一个视图但是添加错误消息。
  • 如果你不想改变或包装你的模型,TempData 就派上用场了。
  • 如果他只想托管一个错误消息,它可以解决问题,是的,但看起来他想托管多个字符串... 显示错误消息 如此多tempdata 可能很棒,或者我提到的一个对象
【解决方案3】:

对我来说最干净的解决方案是创建托管所有错误的自定义对象。 将该对象返回到视图后,您可以通过使用列表和/或一条错误消息(例如,最终用户可以理解的文本)来显示您想要的错误。 这是一个包含多个字段的容器,您可以对其进行编辑以满足您的需求:

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。

T 可以是字符串、自定义对象或任何你想要的集合列表......所以你可以在整个项目中使用它

【讨论】:

  • “最干净的解决方案” - 不,您只是在重建 ModelState。解释为什么这是一个好的解决方案,以及它在现有的错误处理和显示机制上增加了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多