3

我对我的 ASP.NET MVC Web 应用程序有一个相当简单的(解释)要求:

在任何页面上,都能够根据前一页上发生的事件显示消息。消息可能包括动态内容,例如用户在表单提交中输入的信息。

类似于这个...

是的,成功!

该方法必须适用于POST-REDIRECT-GET方案。

如果用户在应用程序上打开了两个浏览器选项卡(它们共享会话状态),那么任何消息都应该只显示在发生相关事件的选项卡中。

例如:

  • 提交反馈表后,感谢用户的消息(按姓名)

  • 登录时,一条消息告诉用户他们上次登录应用程序的日期/时间

我的第一个想法是为此使用带有适当模型(带有string属性)的强类型视图。然而,这意味着更改每个现有的非强类型视图以使用此模型,并更新所有现有模型以继承此新模型。

这似乎有点矫枉过正。

另一种方法是将消息存储在TempData

// In my controller
TempData["Message"] = "Some kind of message";

// In my shared master view
@if (TempData["Message"] != null)
{
    <div class="message">@TempData["Message"]</div>
}

这篇博文TempData中更详细地介绍了使用。有趣的是,作者还建议使用自定义 HTTP 标头作为替代方案。一个有趣的想法,但不适用于 POST-REDIRECT-GET

是使用TempData首选选项,还是有“更好”的选择?(例如,更强的类型)

4

3 回答 3

2

我的第一个想法是为此使用带有适当模型(带有字符串属性)的强类型视图。然而,这意味着更改每个现有的非强类型视图以使用此模型,并更新所有现有模型以继承此新模型。

这是我能想象到的唯一一致、可重用、可测试的解决方案,尽管它可能会导致额外的工作。

于 2013-06-11T14:06:53.857 回答
1

最佳做法是在和ViewModels之间进行通信。你可以有一个基地和所有其他如下:ViewControllersView ModelView Models derived from that

   public class BaseVM
    {
       public string Message{ get; set;}
    }

    public class CreateViewModel: BaseVM
    {
       public string CustoomerName{ get; set;}
    }

Message您可以在将模型返回到控制器时填充属性,如下所示:

public ActionResult Step2()
{
   //Some Logic

    step2Model.Message = "Yes, Success..!!";

    return View(step2Model);
}

之后,在每个视图页面上,您可以检查该属性中是否包含某些内容。您可以按照以下方式进行操作:

 @if(!string.IsNullOrEmpty(Model.Message))
{
  //Show message
}

编辑:

OP 很清楚这种方法,但仍然保留这个答案,因为它有一个片段来显示如何在代码中执行此操作。其次,当谈到使用 ViewModels 时,我同意 CodeCaster 在他的回答中的以下评论。

这是我能想象到的唯一一致、可重用、可测试的解决方案,尽管它可能会导致额外的工作。

于 2013-06-11T14:22:05.930 回答
0

您可以在项目中约定要显示的消息始终进入ViewBag.InfoMessage动态变量。因此,如果它从控制器传递到视图中,您将在您的布局文件中显示它。

更严格的方法是创建一个具有InfoMessage属性的基础模型类,并从该基础派生所有其他模型/视图模型。

要通过 POST-REDIRECT-GET 方案保留消息,请使用会话变量,一旦将值发送到视图,您将清除该变量 - 以避免在多个页面上显示。

这里有一些代码:

public class BaseViewModel
{
    public string InfoMessage { get; set; }
}
public class SpecificViewModel : BaseViewModel
{
    // other model properties
}

然后在您的控制器中:

SpecificViewModel vm = new SpecificViewModel();

vm.InfoMessage = Session["InfoMessage"] as string;
Session["InfoMessage"] = null;

// other code

return View(vm);

当然,您的视图将具有强类型模型:SpecificViewModel.

于 2013-06-11T14:15:48.463 回答