MVC эквивалент события ASP.NET Button Click - PullRequest
3 голосов
/ 16 марта 2011

Мне нужно создать страницу, которая имеет эквивалент события нажатия кнопки в ASP.NET.

На моей странице, когда пользователь нажимает кнопку, мне нужно обработать некоторую информацию и, если произошла ошибка, отобразитьСтраница ошибки, но если она прошла успешно, мне нужно отобразить успешную страницу.Я новичок в MVC, и я не уверен, как это сделать ...

Это то, что я придумал до сих пор (не знаю, будет ли это вообще работать), ясоздаст функцию ActionResult для обработки информации, а затем решит, какую страницу отображать ...

'//Foo page
Function Foo(Byval param1 as String, Byval param2 as String) As ActionResult
    Return View()
End Function

Function FooProcess(Byval param1 as String, Byval param2 as String) As ActionResult
    '//Look up information and process
    '//bSuccess = process(param1, param2)

    '//If bSuccess Then
    '//  redirect to successful page
    '//else
    '//  redirect to error page
    '//end if
End Function

Function FooSuccessful() As ActionResult
    Return View()
End Function

Function FooError(ByVal msg As String) As ActionResult
    Return View()
End Function

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Я не уверен, как это будет выглядеть в VB, но в C # (и в духе MVC) вам понадобятся 3 вещи:

Модель:

public class SomeModel
{
    [DisplayName="Param One"]
    public String ParamOne{get; set;}

    [DisplayName="Param Two"]
    public String ParamTwo{get; set;}
}

A Вид:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeModel>" %>

<asp:Content ID="SomeID" ContentPlaceHolderID="TitleContent" runat="server">
    A title for your page
</asp:Content>
<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server">
        <%        
        using (Html.BeginForm("Process", "SomeModel", returnURL))
        {%>
            <%= Html.LabelFor(m => m.ParamOne)%>:
            <%= Html.TextBoxFor(m => m.ParamOne)%>

            <%= Html.LabelFor(m => m.ParamTwo)%>:
            <%= Html.TextBoxFor(m => m.ParamTwo)%>

            <%--- A button ---%>
            <input type="submit" value="Press Me" />
        <% 
        } %>

        <%--- Display Errors ---%>
        <%= Html.ValidationSummary()%>


</asp:Content>

Контроллер:

public class SomeModelController:Controller
{
     [HttpPost]
     public ActionResult Process(SomeModel model)
     {
         Validate(model);
         return View(model);
     }

     private bool Validate(SomeModel model)
     {
         if(/*both params are valid*/)
         {
             return true;
         }
         else
         {
             ModelState.AddError("error", "Some error message");
             return false;
         }
     }
}

Обратите внимание, что в этом случае любые ошибки проверки будут отображаться на той же странице, на которой они были введены. Если вы хотите изменить это, вам придется изменить контроллер и добавить больше представлений:

[HttpPost]
public ActionResult Process(SomeModel model)
{
    if(ModelState.IsValid && Validate(model))
    {
        return RedirectToAction("Success", "SomeModel");
    }
    else
    {
        return RedirectToAction("Failure", "SomeModel");
    }
}

[HttpGet]
public ActionResult Success(SomeModel model)
{
    return View(model); // Shows the Success.aspx page
}

[HttpGet]
public ActionResult Failure(SomeModel model)
{
    return View(model); // Shows the Failure.aspx page
}

Как я уже сказал, это на C #, но его не должно быть так сложно перевести на VB ... кроме того, это всего лишь общий подход к проблеме, вам, возможно, придется настроить несколько вещей, чтобы на самом деле получить его работать должным образом. Здесь следует отметить, что шаблон MVC вначале может показаться немного громоздким, то есть для простой кнопки вы должны написать LOT кода, но он окупается, когда у вас сложное приложение.

2 голосов
/ 16 марта 2011

вам необходимо использовать атрибуты [AcceptVerbs (HttpVerbs.Post)] и [AcceptVerbs (HttpVerbs.Get)], чтобы различать обычную и опубликованную заднюю страницу, например, здесь:

http://blog.jorritsalverda.nl/2010/03/10/maintainable-mvc-post-redirect-get-pattern/

0 голосов
/ 16 марта 2011

В мире ASP.Net MVC вы обычно делаете что-то вроде этого ...

Обратите внимание ... , что для этого потребуется 3 представления Foo.aspx, FooPass.aspx и FooFail.aspx, и все они будут использовать модель MyModel

Еще одно примечание ... Вы также можете использовать свои строковые параметры, как в вашемобразец.Но этот метод допускает декларативную проверку с аннотациями данных.

Отсюда вы можете автоматически генерировать ваши представления, где Foo.aspx является представлением редактирования, а FooPass и FooFail являются подробными представлениями.

- Контроллер -

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Foo() As ActionResult

        Dim model = New MyModel

        Return View(model)
    End Function

    <HttpPost()>
    Public Function Foo(ByVal model As MyModel) As ActionResult

        If (Me.ModelState.IsValid) Then

            If DoProcess(model) Then
                Return View("FooPass", model)
            Else
                Return View("FooFail", model)
            End If
        Else
            Return View(model)
        End If

    End Function

    Private Function DoProcess(ByVal model As MyModel) As Boolean
        Throw New NotImplementedException()
    End Function

End Class

- Модель -

Public Class MyModel    
    Public Property Param1() As String    
    Public Property Param2() As String    
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...