【问题标题】:jQuery code doesn’t work properly after submitting Ajax.BeginForm in asp.net mvc在 asp.net mvc 中提交 Ajax.BeginForm 后 jQuery 代码无法正常工作
【发布时间】:2017-01-31 08:44:10
【问题描述】:

我试图将大问题最小化为一个小问题,因此我创建了新的示例 Web 项目; VS 中的 mvc-empty。我在 Home 控制器中创建了一个名为“Index”的视图。索引查看代码:

@model WebApplication16.ViewModels.Home.IndexVM
@{
    ViewBag.Title = "Index";
}

@Html.Partial("~/Views/Home/_Orders.cshtml", Model.Orders)

@section scripts{
    <script src="~/Scripts/jquery.validate.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
    <script>
        $("#Type").change(function () {



            $('#order-current > img').remove();
            var currentOrder = "#Type_" + $("#Type").find('option:selected').text();

            var $img = $(currentOrder).clone();
            $img.removeClass("hidden");
            $("#order-current").append($img);

            $("#ajax-form").submit();
        });
    </script>
}

家庭控制器代码:

public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            IndexVM dataVM = new IndexVM();
            GetControlsDataSource(dataVM.Orders);

            return View(dataVM);
        }

        private static void GetControlsDataSource(OrdersVM dataVM)
        {
            List<SelectListItem> typeControlDataSource = new List<SelectListItem>();
            foreach (var en in Enum.GetValues(typeof(TypeEnum)))
            {
                SelectListItem item = new SelectListItem();
                item.Text = en.ToString();
                item.Value = ((int)en).ToString();
                typeControlDataSource.Add(item);
            }
            dataVM.TypeControlDataSource = typeControlDataSource;
        }


        [HttpPost]
        public ActionResult Pay(IndexVM dataVM)
        {
            GetControlsDataSource(dataVM.Orders);
            if (ModelState.IsValid)
            {
                dataVM.Orders.Info = "Info bla bla bla";
                return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders);
            }
            else
            {
                return View(dataVM);
            }

        }
    } 

还有一个名为“_Orders”的局部视图,在Index视图上渲染。_Orders局部视图的代码:

@model WebApplication16.ViewModels.Home.OrdersVM

@using (Ajax.BeginForm("Pay", "Home", new AjaxOptions
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "result",
}, new { id = "ajax-form" }))
{
    <div id="result">
        <div id="order-current">

        </div>


        <div>
            @Html.TextBoxFor(x => x.Name, new { @class = "form-control", style = "margin-top:10px;", id = "Name" })
            @Html.ValidationMessageFor(x => x.Name)
        </div>

        <div>
            @Html.DropDownListFor(x => x.Type, Model.TypeControlDataSource, new { @class = "form-control", style = "margin-top:10px;", id = "Type", })
            @Html.ValidationMessageFor(x => x.Type)
        </div>
        <div>
            <p>@Model.Info</p>
        </div>
        <button type="submit" class="btn btn-primary" name="ok"> OK</button>
    </div>


}

<div id="orders-container">
    <img id="Type_I" src="~/App_Images/Type_I.png" class="img-responsive hidden" />
    <img id="Type_II" src="~/App_Images/Type_II.png" class="img-responsive hidden" />
    <img id="Type_III" src="~/App_Images/Type_III.png" class="img-responsive hidden"/>
</div>
Index model is described by class IndexVM:
public class IndexVM
    {
        public IndexVM()
        {
            this.Orders = new OrdersVM();
        }

        public OrdersVM Orders { get; set; }
    }

_Orders 模型由 OrdersVM 类描述:

public class OrdersVM
    {

        [Required]
        public string Name { get; set; }

        public string Info { get; set; }

        [Required]
        public TypeEnum Type { get; set; }

        public List<SelectListItem> TypeControlDataSource { get; set; }
    }


public enum TypeEnum
{
    I,
    II,
    III
}

在 id=”Type” 的 DropDownListFor 控件中更改值后,应通过位于 Index 视图中的 jquery 代码将隐藏字段中的图片注入到 id=”order-current” 的容器中,然后操作 ajax-form应提交。它工作正常,但调用后

return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders);

在 HomeController 中,字段 Info 已正确更新,但从“order-current” div 容器中注入的图片消失了。我尝试使用 F12 按钮查看 Google Chrome 中有什么问题,没有错误,但在“browserLink”脚本中出现了无限循环。我无法解释为什么。 我只想在提交 ajax-form 后在 id=”order-current 的容器中看到注入的图片。如何做到这一点,我做错了什么?

【问题讨论】:

    标签: javascript c# jquery ajax asp.net-mvc


    【解决方案1】:

    感谢我的朋友,我终于解决了这个问题。更新“结果”容器后,jQuery 添加到此容器中的控件的所有事件都将取消固定。这就是它崩溃的原因。 使其正常工作的方法是创建一个函数并将其固定到 AjaxBeginForm 的 OnComplete 事件。每次通过 ajax 更新结果容器后,都会调用此函数。我还在 Home 控制器中犯了一个小错误,因为我插入了错误的视图模型类。经过所有更改后,它看起来像这样; 家庭控制器代码:

    public class HomeController : Controller
        {
            [HttpGet]
            public ActionResult Index()
            {
                IndexVM dataVM = new IndexVM();
                GetControlsDataSource(dataVM.Orders);
    
                return View(dataVM);
            }
    
            private static void GetControlsDataSource(OrdersVM dataVM)
            {
                List<SelectListItem> typeControlDataSource = new List<SelectListItem>();
                foreach (var en in Enum.GetValues(typeof(TypeEnum)))
                {
                    SelectListItem item = new SelectListItem();
                    item.Text = en.ToString();
                    item.Value = ((int)en).ToString();
                    typeControlDataSource.Add(item);
                }
                dataVM.TypeControlDataSource = typeControlDataSource;
            }
    
    
            [HttpPost]
            public ActionResult Pay(OrdersVM dataVM)
            {
                GetControlsDataSource(dataVM);
                if (ModelState.IsValid)
                {
                    dataVM.Info = "Info bla bla bla";
                    return PartialView("~/Views/Home/_Orders.cshtml", dataVM);
                }
                else
                {
                    return View(dataVM);
                }
    
            }
        }
    

    索引视图:

    @model WebApplication16.ViewModels.Home.IndexVM
    @{
        ViewBag.Title = "Index";
    }
    
    @Html.Partial("~/Views/Home/_Orders.cshtml", Model.Orders)
    
    <div id="orders-container">
        <img id="Type_I" src="~/App_Images/Type_I.png" class="img-responsive hidden" />
        <img id="Type_II" src="~/App_Images/Type_II.png" class="img-responsive hidden" />
        <img id="Type_III" src="~/App_Images/Type_III.png" class="img-responsive hidden" />
    </div>
    
    @section scripts{
        <script src="~/Scripts/jquery.validate.js"></script>
        <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
        <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
        <script>
    
            function imageOnChangeEvent() {
                $("#ajax-form").submit();
            }
    
            function OnCompleteAjaxForm() {
    
                $('#order-current > img').remove();
                var currentOrder = "#Type_" + $("#Type").find('option:selected').text();
    
                var $img = $(currentOrder).clone();
                $img.removeClass("hidden");
                $("#order-current").append($img);
            }
    
        </script>
    
    }
    

    _Orders部分查看代码:

    @model WebApplication16.ViewModels.Home.OrdersVM
    
        <div id="result">
            @using (Ajax.BeginForm("Pay", "Home", new AjaxOptions
            {
                InsertionMode = InsertionMode.Replace,
                UpdateTargetId = "result",
                OnComplete = "OnCompleteAjaxForm()"
            }, new { id = "ajax-form" }))
            {
    
                <div id="order-current">
    
                </div>
    
    
                <div>
                    @Html.TextBoxFor(x => x.Name, new { @class = "form-control", style = "margin-top:10px;", id = "Name" })
                    @Html.ValidationMessageFor(x => x.Name)
                </div>
    
                <div>
                    @Html.DropDownListFor(x => x.Type, Model.TypeControlDataSource, new { @class = "form-control", style = "margin-top:10px;", id = "Type", onchange = "imageOnChangeEvent()" })
                    @Html.ValidationMessageFor(x => x.Type)
                </div>
                <div>
                    <p>@Model.Info</p>
                </div>
                <button type="submit" class="btn btn-primary" id="button_ok" name="ok"> OK</button>
    
    
            }
        </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2012-05-21
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多