使用Ajax渲染局部视图,将对象作为参数

时间:2014-07-19 07:34:55

标签: jquery ajax asp.net-mvc asp.net-mvc-4

首先,我昨天从好人那里得到了一些帮助,帮助我决定采取什么方法:http://stackoverflow.com/questions/24832038/pass-newly-created-object-to-partial-view/24834225#24834225

要点: 我得到了一些Ajax调用创建对象的方法。我想使用Ajax成功消息用我的新对象替换div中的内容。这是Ajax:

$("#btnSaves").click(function () {

        var image = document.getElementById("canvas").toDataURL("image/png");
        image = image.replace('data:image/png;base64,', '');

        $.ajax({
            type: 'POST',
            url: "../../Home/UploadImageS", //THIS METHOD CREATES AN OBJECT
            data: '{ "imageData" : "' + image + '" }',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function (?) {
                HERE I NEED CODE THAT RENDERS A PARTIAL VIEW PASSING THE OBJECT AS A PARAMETER.
            }
        });
    });

这是控制器,我不确定它的返回值应该是什么:

public ActionResult UploadImageS(string imageData)
        {
            string fileNameWitPath = path + DateTime.Now.ToString().Replace("/", "-").Replace(" ", "- ").Replace(":", "") + ".png";
            using (FileStream fs = new FileStream(fileNameWitPath, FileMode.Create))
            {
                using (BinaryWriter bw = new BinaryWriter(fs))
                {
                    byte[] data = Convert.FromBase64String(imageData);
                    bw.Write(data);
                    bw.Close();
                }
            }

            string link = UploadImage(fileNameWitPath);

            JObject o = JObject.Parse(link);

            string name = (string)o.SelectToken("data.link");

            var db = new ArtContext();

            var nyArt = new ArtWork()
            {
                ArtLink = name,

            };

            db.ArtWorks.Add(nyArt);
            db.SaveChanges();
            Return ??
        }
    }

我对使用Ajax感到不舒服,所以如果可能的话,我也会感谢一些解释。

这是我的方法返回的内容:

return  View("TestView",nyArt);

在没有布局的情况下创建的testview:

@model Heroz.Models.ArtWork

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>TestView</title>
</head>
<body>
    <div>
        <img src="@Model.ArtLink"/> 
    </div>
</body>
</html>

现在,当我把一个brekpoint放在:

return  View("TestView",nyArt);

我没有进入&#34;&#34; TestView&#34;,它直接进入_Layout。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是从您的AJAX调用返回的一些HTML,然后您可以在现有元素内部渲染。这是对的吗?

如果是这样,最简单的方法是构造一个包含正确模型的视图,并从方法中返回它。因此,您可以编写一个视图,其中包含您要返回的HTML(没有布局页面或任何内容),然后使用return View();正常返回。

让我们说(例如)您想要返回一些使用您在操作中创建的nyImage对象的HTML。您将使用HTML创建视图并指定要使用的模型(在本例中为nyImage的类型)。

编辑:我使用razor输出模型的name属性,我相信这是图像主机网站上艺术的完整链接。

@model ArtWork

@{
    Layout = null;
}

<div>
    <img src="@Model.name" />
</div>

然后你将这个视图保存为你想要的任何名称,让我们说TestView。然后在你的action方法中,你将返回这个视图,传入模型:

return View("TestView", nyArt);

这将返回包含视图/模型生成的HTML的ViewResult

在客户端上,您将以HTML格式返回此数据,然后如果您希望显示该页面元素,则可以将其附加到页面元素:

success: function (ret) {
    //do something with ret here
    $('#myDiv').html(ret);
    HERE I NEED CODE THAT RENDERS A PARTIAL VIEW PASSING THE OBJECT AS A PARAMETER.
}

以上代码段#myDiv的内容替换为从AJAX调用返回的HTML。