【问题标题】:MVC with Razor: how to refresh partial page on click?带有 Razor 的 MVC:如何在点击时刷新部分页面?
【发布时间】:2013-07-24 20:29:44
【问题描述】:

这个项目使用 MVC3 和 Razor。我们有一个繁忙的页面,数据通过 WCF 服务来自大型机数据库,因此我们希望限制一次加载的内容。基本数据在页面加载时加载,但随后会有一些 div 用于附加数据。我们使用 @Html.Partial(pagename) 在 div 中呈现部分页面。 ViewModel 的这一部分最初是空的,因此不会显示任何数据。

我们希望用户单击以转到 Controller 方法,调用另一个服务,并用更多数据填充 ViewModel 的一部分。然后用数据刷新页面的这一部分。

如何在用户点击时刷新 HTML.Partial(pagename)?我尝试了对适当 URL 的 Ajax 调用,但它没有刷新显示。

编辑:这是我的代码,尝试使用下面 Darin Dimitrov 的建议。

我的视图模型:

namespace Project.ViewModel
{
    public class AllData
    {
        public string Id { get; set; }
        public BasicData Basics { get; set; }
        public ContactInfo ContactPoints { get; set; } //mainframe data
    }
}

主页:

@model Project.ViewModel.AllData

 <script type="text/javascript">
    $(function () {
        $('#loadFromMainFrame').click(function (e) {
            var url = $(this).data(url);
            $('#MainframeContents').load(url);
        });
    });
</script>

<div id="basics">
    <div>
       @Html.DisplayFor(model => model.Basics.FirstName)
    </div>

    <div>
         @Html.DisplayFor(model => model.Basics.LastName)
    </div>     
</div>

<button id="loadFromMainFrame" data-url="@Url.Action("GetFromMainFrame")">Load from mainframe</button>
<div id="MainframeContents">
    <p>Contact Info will go here</p>
</div>

控制器:

    public ActionResult Details(string id)
    {
        BasicData basicdata = new BasicData();
        basicdata.FirstName = "Arya";
        basicdata.LastName = "Stark";
        AllData allData = new AllData();
        allData.Basics = basicdata;
        return View(allData);
    }

    public ActionResult GetFromMainframe()
    {
        AllData allData = new AllData();
        allData.ContactPoints = …getting data from mainframe
        return PartialView("ContactsSection", allData);
    }

详细信息页面呈现。单击按钮会执行脚本,但不会击中控制器。我做错了什么?

我还会发布我所做的其他一些尝试……

【问题讨论】:

  • 看来你应该更正jquery脚本上的语法:var url = $(this).data('url');注意引号。在此之后变量 url 保持什么值?
  • 就是这样!非常感谢!!

标签: jquery asp.net-mvc razor


【解决方案1】:

我尝试了对适当 URL 的 Ajax 调用,但它没有刷新显示。

这正是您应该使用的。假设您有以下视图:

<div id="mainframeContents"></div>

<button id="loadFromMainFrame" data-url="@Url.Action("GetFromMainFrame")">Load from mainframe</button>

然后您可以编写以下脚本,该脚本将在单击按钮时向相应的控制器操作发送 AJAX 请求并在 div 中加载内容:

$(function() {
    $('#loadFromMainFrame').click(function(e) {
        e.preventdefault();
        var url = $(this).data("url");
        $('#mainframeContents').load(url);
    });
});

现在剩下的当然就是拥有相应的控制器操作,该操作将从大型机加载数据并呈现部分视图:

public ActionResult GetFromMainFrame()
{
    SomeModel model = ... go hit the mainframe to retrieve the model using a webservice or whatever you are using to hit it
    return PartialView("_SomePartial", model);
}

【讨论】:

  • 我无法让它工作。按钮应该在父视图中,还是只有部分视图的第二页?我都试过了,但在这两种情况下,我在控制器中的断点都没有被击中。我会尽快发布我的代码。
  • 通过添加引号使其工作,正如弗朗西斯科在上面指出的那样。非常非常感谢!
  • 您在哪里添加了引号?在这个答案中,网址来自哪里?
  • 我认为$(this).data(url); 应该是$(this).data("url");
猜你喜欢
  • 2012-02-25
  • 2015-12-22
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多