-
Notifications
You must be signed in to change notification settings - Fork 151
/
AjaxContinuation.cs
124 lines (107 loc) · 3.76 KB
/
AjaxContinuation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using FubuCore;
using FubuCore.Util;
using FubuLocalization;
namespace FubuMVC.Core.Ajax
{
/// <summary>
/// Used as the return value from Ajax endpoints to standardize the communication and interaction of the server
/// and client. Several built in conventions and external Bottles work with AjaxContinuation
/// </summary>
public class AjaxContinuation
{
private readonly Cache<string, object> _data = new Cache<string, object>();
private readonly IList<AjaxError> _errors = new List<AjaxError>();
/// <summary>
/// Apply key/value pairs
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
[IndexerName("Data")]
public object this[string key]
{
get { return _data[key]; }
set { _data[key] = value; }
}
/// <summary>
/// List of AjaxError's to communicate validation errors to the client
/// </summary>
public IList<AjaxError> Errors
{
get { return _errors; }
}
/// <summary>
/// If expressed, tells the client page to navigate the browser to the designated url
/// </summary>
public string NavigatePage { get; set; }
public bool Success { get; set; }
public string Message { get; set; }
/// <summary>
/// Should the entire page or at least the part of the UI that originated the Ajax call be refreshed?
/// </summary>
public bool ShouldRefresh { get; set; }
/// <summary>
/// Convenience method to get an empty AjaxContinuation{Success = true}
/// </summary>
/// <returns></returns>
public static AjaxContinuation Successful()
{
return new AjaxContinuation
{
Success = true
};
}
/// <summary>
/// Convenience method to build an AjaxContinuation for a failure message
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static AjaxContinuation ForMessage(StringToken message)
{
return ForMessage(message.ToString());
}
/// <summary>
/// Convenience method to build an AjaxContinuation for a failure message
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static AjaxContinuation ForMessage(string message)
{
return new AjaxContinuation
{
Message = message
};
}
/// <summary>
/// Builds a dictionary that FubuMVC will serialize to Json
/// </summary>
/// <returns></returns>
public virtual IDictionary<string, object> ToDictionary()
{
var dict = new Dictionary<string, object>
{
{"success", Success},
{"refresh", ShouldRefresh}
};
Message.IfNotNull(x => dict.Add("message", x));
NavigatePage.IfNotNull(x => dict.Add("navigatePage", x));
_data.Each(dict.Add);
if (_errors.Any())
{
dict.Add("errors", _errors.ToArray());
}
return dict;
}
/// <summary>
/// Does this AjaxContinuation have a value for the key?
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public virtual bool HasData(string key)
{
return _data.Has(key);
}
}
}