【问题标题】:Partial view render on button click单击按钮时呈现局部视图
【发布时间】:2012-08-15 22:01:55
【问题描述】:

我有索引视图:

@using System.Web.Mvc.Html
@model  MsmqTestApp.Models.MsmqData
<!DOCTYPE html>
<html>
<head>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
    <meta name="viewport" content="width=device-width" />
    <title>MsmqTest</title>
</head>
<body>
    <div>
        <input type="submit" id="btnBuy" value="Buy" onclick="location.href='@Url.Action("BuyItem", "MsmqTest", new { area = "Msmq" })'" />
        <input type="submit" id="btnSell" value="Sell" onclick="location.href='@Url.Action("SellItem", "MsmqTest", new { area = "Msmq" })'" />
    </div>
    <div id="msmqpartial">
    @{Html.RenderPartial("Partial1", Model); }

    </div>
</body>
</html>

和部分:

@using System.Web.Mvc.Html
@model  MsmqTestApp.Models.MsmqData

    <p>
        Items to buy
        @foreach (var item in Model.ItemsToBuy)
        { 
            <tr>
                <td>@Html.DisplayFor(model => item)
                </td>
            </tr>
        }
    </p>
    <p>
        <a>Items Selled</a>
        @foreach (var item in Model.ItemsSelled)
        { 
            <tr>
                <td>@Html.DisplayFor(model => item)
                </td>
            </tr>
        }
    </p>

和控制器:

 public class MsmqTestController : Controller
    {
        public MsmqData data = new MsmqData();

        public ActionResult Index()
        {

            return View(data);
        }

        public ActionResult BuyItem()
        {
            PushIntoQueue();
            ViewBag.DataBuyCount = data.ItemsToBuy.Count;
            return PartialView("Partial1",data);
        }
}

当我点击一个按钮只是部分视图渲染时,如何做到这一点,现在控制器想要将我移动到 BuyItem 视图;/

【问题讨论】:

    标签: asp.net asp.net-mvc partial-views


    【解决方案1】:

    首先要做的是引用jQuery。现在你只引用了jquery.unobtrusive-ajax.min.js,但是这个脚本依赖于jQuery,所以不要忘记在它之前包含:

    <script src="@Url.Content("~/Scripts/jquery.jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
    

    现在回答您的问题:您应该使用带有 HTML 表单的提交按钮。在您的示例中,您没有表单,因此使用普通按钮在语义上会更正确:

    <input type="button" value="Buy" data-url="@Url.Action("BuyItem", "MsmqTest", new { area = "Msmq" })" />
    <input type="button" value="Sell" data-url="@Url.Action("SellItem", "MsmqTest", new { area = "Msmq" })" />
    

    然后在单独的 javascript 文件中通过订阅 .click() 事件对这些按钮进行 AJAX 化:

    $(function() {
        $(':button').click(function() {
            $.ajax({
                url: $(this).data('url'),
                type: 'GET',
                cache: false,
                success: function(result) {
                    $('#msmqpartial').html(result);
                }
            });
            return false;
        });
    });
    

    或者,如果您想依赖 Microsoft 不显眼的框架,您可以使用 AJAX 操作链接:

    @Ajax.ActionLink("Buy", "BuyItem", "MsmqTest", new { area = "Msmq" }, new AjaxOptions { UpdateTargetId = "msmqpartial" })
    @Ajax.ActionLink("Sell", "SellItem", "MsmqTest", new { area = "Msmq" }, new AjaxOptions { UpdateTargetId = "msmqpartial" })
    

    如果你想要按钮而不是锚点,你可以使用 AJAX 表单:

    @using (Ajax.BeginForm("BuyItem", "MsmqTest", new { area = "Msmq" }, new AjaxOptions { UpdateTargetId = "msmqpartial" }))
    {
        <button type="submit">Buy</button>
    }
    @using (Ajax.BeginForm("SellItem", "MsmqTest", new { area = "Msmq" }, new AjaxOptions { UpdateTargetId = "msmqpartial" }))
    {
        <button type="submit">Sell</button>
    }
    

    据我所知,您已经将 jquery.unobtrusive-ajax.min.js 脚本包含到您的页面中,这应该可以工作。

    【讨论】:

    • 在上一个例子中你没有使用UpdateTargerId,这是出于目的还是错误?
    • 搞错了。感谢您的关注。我会解决的。
    • @DarinDimitrov : 当使用@Ajax.ActionLink 时我应该再次编写 JS 代码吗?我也陷入了类似的境地。
    【解决方案2】:

    也许不是您正在寻找的解决方案,但是,我会忘记部分并使用 Javascript 调用服务器以获取所需的数据,然后将数据作为 JSON 返回到客户端并使用它将结果呈现到页面异步。

    JavaScript 函数;

    var MyName = (function () {
    
    
    //PRIVATE FUNCTIONS
    var renderHtml = function(data){
       $.map(data, function (item) {
           $("<td>" + item.whateveritisyoureturn + "</td>").appendTo("#msmqpartial");
       });
    };
    
    //PUBLIC FUNCTIONS
    var getData = function(val){
       // call the server method to get some results.
        $.ajax({ type: "POST",
            url: "/mycontroller/myjsonaction",
            dataType: "json",
            data: { prop: val },
            success: function (data) {
                renderHtml();
            },
            error: function () {
            },
            complete: function () {
            }
        });
    };
    
    //EXPOSED PROPERTIES AND FUNCTIONS
    return {
        GetData : getData
    };
    
    
    })();
    

    在服务器上....

    public JsonResult myjsonaction(string prop)
            {
                var JsonResult;
    
                // do whatever you need to do
    
                return Json(JsonResult);
            }
    

    希望这会有所帮助....

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 2014-10-18
      • 2019-11-13
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多