English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
때때로 이런 상황이 발생할 수 있습니다: 하나의 양식에서 다양한 기능을 완료하기 위해 여러 가지 버튼이 필요합니다. 예를 들어, 간단한 승인 기능입니다.
webform을 사용하는 경우 논의할 필요가 없지만, asp.net mvc에서는 하나의 폼이 하나의 Action 처리만 제출할 수 있어 상대적으로 어려울 수 있습니다.
메서드 1:클라이언트 스크립트 사용
예를 들어 View에서 이렇게 작성할 수 있습니다:
<input type="submit" value="검토 통과" onclick='this.form.action="<%=Url.Action("Action1)%>"/> <input type="submit" value="검토 불통" onclick='this.form.action="<%=Url.Action("Action2)%>" /> <input type="submit" value="돌아가기" onclick='this.form.action="<%=Url.Action("Action3)%>" />
제출 버튼을 클릭할 때, Form의 action 속성을 변경하여 형식을 버튼의 해당 action 처리로 제출합니다.
하지만 때로는 Action1과2의 로직은 매우 유사합니다. 아마도 특정 필드의 값을 설정하는 것만 다를 뿐입니다.1또는 0이면 두 개의 action으로 분리하여 사용하는 것도 불필요합니다.
메서드 2:Action에서 어떤 버튼을 통해 제출되었는지 판단합니다
View에서는 클라이언트 스크립트를 사용하지 않고, 각 제출 버튼에 name 속성을 추가합니다:
<input type="submit" value="검토 통과" name="action" /> <input type="submit" value="검토 불통" name="action"/> <input type="submit" value="돌아가기" name="action"/>
그런 다음 컨트롤러에서 판단합니다:
[HttpPost] public ActionResult Index(string action /* 기타 매개변수*/) { if (action=="검토 통과") { // } else if (action=="검토 불통") { // } else { // } }
몇 년 전 asp 코드를 작성할 때 자주 이렇게 했습니다...
View가 간단해지면 Controller가 복잡해집니다.
View에 너무 의존하면 문제가 발생할 수 있습니다. 고객이 버튼에 '검토 통과'로 텍스트를 변경하거나 다국어 버전을 만들면 어려울 수 있습니다.
메서드 3:ActionSelector 사용
ActionSelector의 기본 원리에 대해 알고 싶다면 이 POST에서 ActionSelector를 사용하여 Action 선택을 제어하는 방법을 확인해 보세요.
이 메서드를 사용하여 다음과 같은 컨트롤러를 작성할 수 있습니다:
[HttpPost] [MultiButton("action"1) public ActionResult Action1(), { // return View(); } [HttpPost] [MultiButton("action"2) public ActionResult Action2(), { // return View(); }
View에서:
<input type="submit" value="검토 통과" name="action"1" /> <input type="submit" value="검토 불가" name="action"2"/> <input type="submit" value="돌아가기" name="action"3"/>
이제 Controller는 버튼의 Value 값에 의존하지 않습니다.
MultiButtonAttribute의 정의는 다음과 같습니다:
public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public MultiButtonAttribute(string name) { this.Name = name; } public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo) { if (string.IsNullOrEmpty(this.Name)) { return false; } return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name); } }
방법 넷:개선
Controller:
[HttpPost] [MultiButton(Name = "delete", Argument = "id")] public ActionResult Delete(string id) { var response = System.Web.HttpContext.Current.Response; response.Write("Delete action was invoked with "); + id); return View(); }
View:
<input type="submit" value="미취급" name="delete" /> <input type="submit" value="미취급" name="delete:id" />
MultiButtonAttribute 정의:
코드
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public string Argument { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) { var key = ButtonKeyFrom(controllerContext); var keyIsValid = IsValid(key); if (keyIsValid) { UpdateValueProviderIn(controllerContext, ValueFrom(key)); } return keyIsValid; } private string ButtonKeyFrom(ControllerContext controllerContext) { var keys = controllerContext.HttpContext.Request.Params.AllKeys; return keys.FirstOrDefault(KeyStartsWithButtonName); } private static bool IsValid(string key) { return key != null; } private static string ValueFrom(string key) { var parts = key.Split(":".ToCharArray()); return parts.Length < 2 ? null : parts[1]; } private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult (value, value, null); } private bool KeyStartsWithButtonName(string key) { return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase); } } //MVC에서는 2.0에서는 UpdateValueProviderIn 메서드를 변경하십시오: private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.RouteData.Values[this.Argument] = value; }
이것이 이 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바랍니다. 또한, 여러분이 많이 지지해 주시길 바랍니다. 노래 강의.
선언: 이 문서의 내용은 인터넷에서 가져온 것으로, 저작권자는 모두이며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 이 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 의심되는 내용이 있다면, notice#w로 이메일을 보내 주세요.3codebox.com에 (이메일을 보내는 경우, #을 @으로 변경하십시오) 신고하시고 관련 증거를 제공하시면, 실제로 확인되면 이 사이트는 즉시 의심스러운 저작권 내용을 삭제합니다.