通过WebService调用访问页面模型

时间:2013-08-22 07:38:01

标签: c# asp.net-mvc-4

我创建了一个MVC 4应用程序。在那里,我有一些观点。这些视图中的每一个都可以在浏览器中显示,也可以作为电子邮件的正文。

作为电子邮件的正文是主要目的,但我添加了一个链接以在浏览器中显示正文。

我有一个网络服务电话,"浏览"到页面并获取其来源并将其作为HTML应用于电子邮件正文中,然后我使用System.Net.Mail。

现在,在WebService调用中,我需要访问所服务页面的Model的某些值。这甚至可能吗?我是以完全错误的方式做的吗?你有什么建议吗?

页面和WebService都在同一个项目下。

更新 我的实际问题是如何处理图像。我想嵌入它们(用于电子邮件)或提供链接(用于浏览器)。所以我的模型将图像放在\

list<System.IO.Stream>

视图呈现部分html,如下所示:

@model MyProject.Models.ImageTag
@if (@Model.ContentType == 2)
{
    <img src="cid:@Model.ImageReference"border="0" alt="" />
}
else
{
    <img src="http://www.mysite.com/images/@Model.PropertyId/@Model.Photo" border="0" alt="" />
}

网络服务需要知道&#34;这些图像是为了在LinkedResources中添加它们:

foreach (MyProject.Models.Images image in Model.Images)
{
    LinkedResource lr = new LinkedResource(image.image, "image/jpeg");
    lr.ContentId = image.Name;
    lr.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
    lrc.Add(lr);
}

由于没有模型,上述工作当然不会成功。所以这是我的问题。

Model.Images是

List<Img>

img是

public class Img
{
    public string Name { get; set; }
    public System.IO.Stream image {get;set;}
}

2 个答案:

答案 0 :(得分:0)

所以你的服务从MVC View下载HTML,你想在该响应中放入一个有意义的字段吗?

您可以使用一些选项,例如:

  • 发送包含值
  • 的HTTP标头
  • 将值放在HTML元素中,例如使用HtmlAgilityPack
  • 提取
  • 使用包含您的值的第一行,然后是HTML
  • 的其余部分来启动HTML

但似乎你想让HTML页面做得太多。如果该视图的唯一目的是呈现电子邮件正文,那就让它做到这一点。也许创建另一个服务方法或JSON结构,它为您提供所需的值,呈现邮件模板的相应URL。

答案 1 :(得分:0)

是的,我会说你做错了。视图的目的是将模型的数据呈现为您需要的任何表示形式:电子邮件消息的内容,格式化的单独值。作为json或纯文本,或两者兼而有之。

有几种方法可以从同一视图中返回不同类型的信息:

  • 您可以返回多部分HTTP响应,这在客户端处理起来很棘手,但是您可以通过相同的调用获得两种类型的内容
  • 如果存在可选的查询参数,则可以返回值,例如Json,而不是HTML视图。您需要两个单独的调用才能返回两个响应。
  • 您可以创建单独的视图以返回额外数据
  • 您可以将额外数据作为HTTP标头
  • 返回

以某种方式在HTML中添加数据并不是一个好主意。除非您希望收件人也接收数据,否则您必须在发送电子邮件之前将其从返回的HTML中删除。

如果我只想返回2-3个不需要复杂处理的小值,我会从第4个选项开始,否则我会创建两个单独的视图。

如果不同场景需要这些值,即不准备电子邮件,我肯定会创建一个不同的视图和一个只返回我需要的值的模型。