Я не думаю, что здесь есть универсальное решение.
В любом случае, это мое решение, использующее jQuery:
1) Создайте класс MyResultModel для обработки сообщения пользователю
public enum MyResultType { Info, Error }
public class MyResultModel
{
public MyResultModel( MyResultType type, string message ) {
switch ( type ) {
case MyResultType.Info: Title = "OK"; break;
case MyResultType.Error: Title = "Error!!!"; break;
}
Message = message;
}
public String Title { get; set; }
public String Message { get; set; }
}
2) Создайте частичное представление с именем MyResult
в общей папке для обработки модели
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyResultModel>" %>
<div id="resultTitle"><%: Model.Title %></div>
<div id="resultMessage"><%: Model.Message %></div>
3) Создайте и используйте BaseController для ваших контроллеров и добавьте следующий методк этому.Метод просто добавляет пользовательский заголовок Http к ответу
protected PartialViewResult PartialView( string viewName, object model, string resultHeader ) {
Response.AppendHeader( "MyHttpCustomHeader", resultHeader );
return base.PartialView( viewName, model );
}
4) В вашем действии верните MyResultView, когда вы сделали
[HttpPost]
public virtual ActionResult DoSomething() {
try {
//Do Something
return PartialView( "MyResult",
new MyResultModel( MyResultType.Info, "Operation Completed" ),
"HttpResultInfo" );
}
catch ( Exception ex ) {
return PartialView( "MyResult",
new MyResultModel( MyResultType.Error, ex.Message ),
"HttpResultError" );
}
}
5) Наконец, отправьте форму, используя jquery, и обработайте результаты.
$.ajax({
type: "post",
dataType: "html",
url: "your/url/here",
data: $("#myform").serialize(),
success: function (response, status, xml) {
var resultType = xml.getResponseHeader("MyHttpCustomHeader");
if (resultType == null) {
//No message do whatever you need
}
else {
//response contain your HTML partial view here. Choose your
//desidered way to display it
}
}
});
При таком сценарии вам не нужно размещать элемент управления на главной странице.Вы можете:
- Показывать вид, полученный из действия, без каких-либо изменений.
- Использовать некоторую причудливую технику отображения сообщений, как это делает StackOverflow с оранжевым скользящим сообщением (в этом случае просто извлечьзаголовок и сообщение из возвращенного html)
- Используйте какой-нибудь необычный плагин jquery как jGrowl , чтобы показать ваше сообщение
Если вы хотите проверить, является ли оноИнформация / сообщение об ошибке просто проверьте пользовательский заголовок с помощью jQuery в else
ветви
var title = $(response).filter("#resultTitle").text();
var message = $(response).filter("#resultMessage").text();
if (resultType == "HttpResultInfo") {
showInfoMessage(title, message);
}
else if (resultType == "HttpResultError") {
showErrorMessage(title, message);
}
Надеюсь, это поможет!