Как вы обрабатываете несколько кнопок отправки в ASP.NET MVC Framework?

Не самый элегантный способ, но это сработало для меня:

var ms = date.substring(6, date.length - 2);
var newDate = formatDate(ms);


function formatDate(ms) {

    var date = new Date(parseInt(ms));
    var hour = date.getHours();
    var mins = date.getMinutes() + '';
    var time = "AM";

    // find time 
    if (hour >= 12) {
        time = "PM";
    }
    // fix hours format
    if (hour > 12) {
        hour -= 12;
    }
    else if (hour == 0) {
        hour = 12;
    }
    // fix minutes format
    if (mins.length == 1) {
        mins = "0" + mins;
    }
    // return formatted date time string
    return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
}
705
задан alamin 18 November 2015 в 07:33
поделиться

8 ответов

Можно проверить имя в действие, как был упомянут, но Вы могли бы рассмотреть, является ли это хорошим дизайном. Это - хорошая идея рассмотреть ответственность действия и не связать этот дизайн слишком много с именами кнопки Мне нравится аспектов UI. Поэтому рассмотрите использование 2 форм и 2 действий:

<% Html.BeginForm("Send", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<% Html.EndForm(); %>

<% Html.BeginForm("Cancel", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

кроме того, в случае "Отмены", Вы обычно просто не обрабатываете форму и идете в новый URL. В этом случае Вы не должны отправлять форму вообще и просто нуждаться в ссылке:

<%=Html.ActionLink("Cancel", "List", "MyController") %>
120
ответ дан Trevor de Koekkoek 18 November 2015 в 07:33
поделиться

Дайте Вашим кнопкам отправки имя, и затем осмотрите отправленное значение в своем методе контроллера:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

регистрация на

public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

    private ActionResult Cancel() {
        // process the cancellation request here.
        return(View("Cancelled"));
    }

    private ActionResult Send() {
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    }

}

РЕДАКТИРОВАНИЕ:

Для расширения этого подхода для работы с локализованными сайтами изолируйте сообщения где-то в другом месте (например, компиляция файла ресурсов к классу ресурса со строгим контролем типов)

Тогда изменяют код, таким образом, это работает как:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="<%= Html.Encode(Resources.Messages.Send)%>" />
<input type="submit" name="submitButton" value="<%=Html.Encode(Resources.Messages.Cancel)%>" />
<% Html.EndForm(); %>

и Ваш контроллер должен быть похожим на это:

// Note that the localized resources aren't constants, so 
// we can't use a switch statement.

if (submitButton == Resources.Messages.Send) { 
    // delegate sending to another controller action
    return(Send());

} else if (submitButton == Resources.Messages.Cancel) {
     // call another action to perform the cancellation
     return(Cancel());
}
460
ответ дан Dylan Beattie 18 November 2015 в 07:33
поделиться

Eilon предполагает, что можно сделать это как это:

, Если у Вас есть больше чем одна кнопка, можно различать их путем давания каждой кнопке имени:

<input type="submit" name="SaveButton" value="Save data" />
<input type="submit" name="CancelButton" value="Cancel and go back to main page" />

В Вашем методе действия контроллера можно добавить параметры, названные в честь имен тега ввода HTML:

public ActionResult DoSomeStuff(string saveButton, string
cancelButton, ... other parameters ...)
{ ... }

, Если какое-либо значение отправляется на один из тех параметров, который означает, что кнопка была той, которая была нажата. Веб-браузер только отправит значение для одно кнопка, которая была нажата. Все другие значения будут пустыми.

if (saveButton != null) { /* do save logic */ }
if (cancelButton != null) { /* do cancel logic */ }

мне нравится этот метод, поскольку он не полагается на свойство значения кнопок отправки, которое, более вероятно, изменится, чем присвоенные имена и не требует, чтобы JavaScript, который будет включен

, Видел: http://forums.asp.net/p/1369617/2865166.aspx#2865166

97
ответ дан Spoike 18 November 2015 в 07:33
поделиться

Необходимо быть в состоянии назвать кнопки и дать им значение; тогда отобразите это имя как аргумент действию. С другой стороны, используйте 2 отдельных ссылки действия или 2 формы.

21
ответ дан Marc Gravell 18 November 2015 в 07:33
поделиться

Вы могли записать:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

И затем в проверке страницы, если имя == "Отправляет" или называет == "Отмена"...

13
ответ дан Kris van der Mast 18 November 2015 в 07:33
поделиться

Дэвид Финдли в своем блоге ASP.Net пишет о трех различных вариантах, которые у вас есть для этого.

Прочтите статью несколько кнопок в одной форме , чтобы увидеть его решения, а также преимущества и недостатки каждой из них. ИМХО, он предлагает очень элегантное решение, в котором используются атрибуты, которыми вы украшаете свое действие.

7
ответ дан 22 November 2019 в 21:33
поделиться

Только что написал об этом сообщение: Несколько кнопок отправки с ASP.NET MVC :

По сути, вместо использования ActionMethodSelectorAttribute , я использую ActionNameSelectorAttribute , что позволяет мне делать вид, что имя действия - все, что я хочу. К счастью, ActionNameSelectorAttribute не просто заставляет меня указывать имя действия, вместо этого я могу выбрать, соответствует ли текущее действие запросу.

Итак, есть мой класс (кстати, название мне не нравится):

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
} 

Чтобы использовать, просто определите такую ​​форму:

<% using (Html.BeginForm("Action", "Post")) { %>
  <!— …form fields… -->
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
<% } %> 

и контроллер с двумя методами

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    } 
}

Как видите, атрибут не требовать от вас вообще ничего указывать. Кроме того, названия кнопок транслируются непосредственно в названия методов. Кроме того (я этого не пробовал), они также должны работать как обычные действия, поэтому вы можете отправлять сообщения любому из них напрямую.

45
ответ дан 22 November 2019 в 21:33
поделиться

Я предлагаю заинтересованным сторонам взглянуть на решение Маартена Баллиау . Я считаю, что это очень элегантно.

В случае, если ссылка исчезает, она использует атрибут MultiButton , применяемый к действию контроллера, чтобы указать, к какому нажатию кнопки должно относиться это действие.

35
ответ дан 22 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: