Asp.net MVC 限制一個方法到指定的Submit按鈕


        在Asp.net Web Form 中,每個單獨的 HTML Form 有時會包含多個Submit的button. 那么用戶最后點擊那一個Button. 我們通常需要借助Javascript來幫助我們,先看下面的Html代碼:

    <form name="myform" id="myform" method="post">
    <input type="text" id="username" />
    <input type="text" id="password" />
    <br />
    <input type="submit" value="Update" name="updateaction" onclick="setAction('update')" />
    <input type="submit" value="Delete" name="deleteaction" onclick="setAction('delete')" />
    </form>

那么這時需要這樣的Javascript,定義一個setAction的function,如果您熟悉Javascript不難看懂:

    <script type="text/javascript">
        function setAction(action) {
            document.getElementById("myform").action = action;
        }
    </script>

 

Asp.net MVC 應用程序中,我們不能這樣一直到處添加上面這樣的代碼。那么我們實現一個自定義的Attribute:

    /// <summary>
    /// OnlyIfPostedFromButtonAttribute
    /// </summary>
    public class OnlyIfPostedFromButtonAttribute : ActionMethodSelectorAttribute
    {
        public String SubmitButton { get; set; }
        public String ViewModelSubmitButton { get; set; }
 
        public override Boolean IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
        {
            var buttonName = controllerContext.HttpContext.Request[SubmitButton];
            if (buttonName == null)
            {
                //This is neccessary to support the RemoteAttribute that appears to intercepted the form post 
                //and removes the submit button from the Request (normally detected in the code above) 
                var viewModelSubmitButton = controllerContext.HttpContext.Request[ViewModelSubmitButton];
                if ((viewModelSubmitButton == null) || (viewModelSubmitButton != SubmitButton))
                    return false;
            }
 
            // Modify the requested action to the name of the method the attribute is attached to 
            controllerContext.RouteData.Values["action"] = methodInfo.Name;
            return true;
        }
    } 


對應的我們假設有這樣的Model與Controller:

    public class PeterLiuViewModel
    {
        [Remote("UserAlreadyRegistered", "PeterLiu", AdditionalFields = "Version", ErrorMessage = "This Username is already registered with the agency.")]
        public string UserName { get; set; }
 
        public int Version { get; set; }
        public string SubmitButtonName { get; set; }
    }


在當前上下文Controller中的Action中增加這樣的方法, 你可以看到OnlyIfPostedFromButton的Attribute指定每個Action,需要對應的Submit的button。這里還有增加ActionName

        [HttpPost]
        [ActionName("Details")]
        [OnlyIfPostedFromButton(SubmitButton = "editUser", ViewModelSubmitButton = "SubmitButtonName")]
        public ActionResult DetailsEditUser(PeterLiuViewModel nom)
        {
            return RedirectToAction("Edit", "Home", new { id = nom.UserName });
        }
   
        [HttpPost]
        [ActionName("Details")]
        [OnlyIfPostedFromButton(SubmitButton = "sendActivationEmail", ViewModelSubmitButton = "SubmitButtonName")]
        public ActionResult DetailsSendActivationEmail(PeterLiuViewModel nom)
        {
            return RedirectToAction("SendActivationEmail", "Home", new { id = nom.UserName });
        }

 

好的,讓我們來看View的Razor語法的代碼:

@using (Html.BeginForm("Details","Home"))
{
    <p>
        @Html.LabelFor(m => m.UserName)
        @Html.DisplayFor(m => m.UserName)
    </p> 
 
    <input type="submit" name="editUser" value="Edit" data-action="editUser" /> 
    <input type="submit" name="sendActivationEmail" value="SendActivationEmail" data-action="sendActivationEmail" /> 
    @Html.HiddenFor(m => m.SubmitButtonName)
}
<script type="text/javascript">
    $(document).ready(function () {
        $("input[type=submit][data-action]").click(function (e) {
            var action = $(this).attr('data-action');
            $("#SubmitButtonName").val(action);
        });
    });
 
</script>


上面的代碼可以看出,我們放置了一個Hidden input,然后用JQuery前端取得data-action的特性值把它做為val給SubmitButtonName的Hidden input。代碼很簡單,希望對您開發有幫助。

您可以感興趣的文章:

實現Asp.net MVC中AjaxOnly特性
Asp.net MVC3擴展之Ajax異常處理特性

 


作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發布在我的獨立博客中-Petter Liu Blog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM