Не самый элегантный способ, но это сработало для меня:
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;
}
Можно проверить имя в действие, как был упомянут, но Вы могли бы рассмотреть, является ли это хорошим дизайном. Это - хорошая идея рассмотреть ответственность действия и не связать этот дизайн слишком много с именами кнопки Мне нравится аспектов 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") %>
Дайте Вашим кнопкам отправки имя, и затем осмотрите отправленное значение в своем методе контроллера:
<% 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());
}
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
Необходимо быть в состоянии назвать кнопки и дать им значение; тогда отобразите это имя как аргумент действию. С другой стороны, используйте 2 отдельных ссылки действия или 2 формы.
Вы могли записать:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>
И затем в проверке страницы, если имя == "Отправляет" или называет == "Отмена"...
Дэвид Финдли в своем блоге ASP.Net пишет о трех различных вариантах, которые у вас есть для этого.
Прочтите статью несколько кнопок в одной форме , чтобы увидеть его решения, а также преимущества и недостатки каждой из них. ИМХО, он предлагает очень элегантное решение, в котором используются атрибуты, которыми вы украшаете свое действие.
Только что написал об этом сообщение: Несколько кнопок отправки с 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(…) {
//…
}
}
Как видите, атрибут не требовать от вас вообще ничего указывать. Кроме того, названия кнопок транслируются непосредственно в названия методов. Кроме того (я этого не пробовал), они также должны работать как обычные действия, поэтому вы можете отправлять сообщения любому из них напрямую.
Я предлагаю заинтересованным сторонам взглянуть на решение Маартена Баллиау . Я считаю, что это очень элегантно.
В случае, если ссылка исчезает, она использует атрибут MultiButton
, применяемый к действию контроллера, чтобы указать, к какому нажатию кнопки должно относиться это действие.