如何使用Ajax(或类似的东西)调用模型函数?

时间:2014-07-16 16:03:37

标签: c# ajax asp.net-mvc

当有一个方法 - ToHtml() - 被调用时,我有一个模型(除其他外)返回自身的表格表示。

LotSpaceLotRow都是(为简洁起见)我不包括的模型。他们实际上是在进行数据库调用,这也是我想使用ajax调用重绘这一批次的原因。如果它们与此问题相关,我可以添加它们。

public class Lot
{
    public List<LotSpace> Spaces;
    public List<LotRow> Rows;
    public int SpacesPerRow
    {
        get
        {
            return (Spaces.Count / Rows.Count);
        }
    }


    public Lot(int startSpace, int endSpace, int numberOfRows)
    {
        Spaces = LotSpace.ToList(startSpace, endSpace);

        /***testing*****/
        Spaces[0].Blocked = true;
        Spaces[1].Blocked = true;
        Spaces[2].Blocked = true;
        Spaces[3].Blocked = true;
        Spaces[4].Blocked = true;
        Spaces[5].Blocked = true;
        Spaces[6].Blocked = true;
        Spaces[7].Blocked = true;
        /***testing*****/

        Rows = LotRow.ToList(numberOfRows);

        LoadSpacesIntoRows();
    }

    private void LoadSpacesIntoRows()
    {
        foreach(var space in Spaces)
        {
            int rowIndex = 0;
            while(rowIndex < Rows.Count)
            {
                if(Rows[rowIndex].Spaces.Count < SpacesPerRow)
                {
                    Rows[rowIndex].Spaces.Add(space);
                    break;
                }

                rowIndex++;
            }
        }
    }

    public string ToHtml()
    {
        Table table = MapMaker.HTML.CreateTable(this);
        MapMaker.HTML.AddSpaces(table, this);
        return MapMaker.HTML.ControlToString(table);
    }
}

现在从这个视图中调用它:

控制器

public ActionResult Index()
{
    return View(new Lot(392, 1, 7));
}

查看

<div class="row">
    @Html.Raw(Model.ToHtml())
</div>

这有效,但在某些情况下,我希望能够重绘这张地图。是否可以从视图中进行ajax调用,以便我可以按需重绘该部分视图而无需重新加载整页?

1 个答案:

答案 0 :(得分:3)

是。但是AJAX不会“在模型上调用方法”,它会调用控制器操作。因此,例如,您可以使用新视图创建一个新的控制器操作,该视图仅返回 该HTML:

public ActionResult Lot()
{
    return View(new Lot(392, 1, 7));
}

除了@model声明之外,视图只是:

@Html.Raw(Model.ToHtml())

现在您有一个URL,它只返回该表的HTML而没有其他内容。您可以使用jQuery load()函数:

之类的东西来获取它
$('#yourDiv').load('@Url.Action("Lot", "YourController")');

AJAX请求与任何其他请求一样是标准的HTTP请求。您只需要服务器上的端点来处理该请求并返回响应。