重用模型MVC

时间:2013-02-15 14:15:50

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

我有以下情况,目前我从外部服务(我无法控制)检索整个人,包括他们的地址。我只想显示地址的一个实例,然后有一个模型,以便在需要时显示其余部分。目前我传递了这个想法,然后再对外部服务进行查找,但是因为我已经有了数据,所以效率很低。

任何人都可以帮助制定好的策略,这是传输地址列表的最佳方式吗?

注意我以简化形式重新输入了代码,因此请忽略任何拼写错误

模型

public class PersonModel
{
    Public int Id {get;set}
    Public String Name {get; set;}
    Public IEnumerable Address {get; set;}
    // Single Address from the collection 
    Public DisplayAddress {get;set;}
}

public class AddressesViewModel
{
    public IEnumerable<Address> Address { get; set; }
}

视图

@model PersonModel  
<span>@Model.Name</span>
<ol>
                        @if (Model.DisplayAddress != null)
                        {
                            <li>@Model.DisplayAddress.Line1</li>

                        <li>@Model.DisplayAddress.Line2</li>
                        <li>@Model.DisplayAddress.Line3 </li>

                        <li>@Model.DisplayAddress.Town</li>
                        <li>@Model.DisplayAddress.County</li>
                        <li>@Model.DisplayAddress.PostalCode</li>
                        <li>@Model.DisplayAddress.Country</li>
                        }
                    </ol>
 <a id="showalladdresses" title="View all addresses" href="#">View All Addressess</a>

@section scripts {
<script type="text/javascript">
    $(function () {
        $('#Modal').dialog({
            autoOpen: false,
            height: 600,
            width: 800,
            resizable: false,
            modal: true
        });

        $('#showalladdresses').click(function () {
            $('#Modal').load("@Url.Action("ViewAddresses", new { id = Model.Id })", function () {
                $(this).dialog('open');
            });
            return false;
        });

    });

 }

控制器

 public ActionResult PersonBanner(long? Id)
    {
        if (!Id.HasValue)
            return RedirectToAction("Index", "HomeController");


        var result = new PersonModel();
        result = unitOfWork.GetPersonSummaryDetails(Id.Value)


        return View(result);
    }
public ActionResult ViewAddresses(long Id)
    {

        var model = new AddressesViewModel
            {
             Address = unitOfWork.GetAddressesById(Id);
            };
        if (Request.IsAjaxRequest())
            return PartialView(model);
        return View(model);
    }

2 个答案:

答案 0 :(得分:0)

可以再次获取数据。只需将PatientSummaryDetails放入缓存中即可。

答案 1 :(得分:0)

  

然而,由于我已经掌握了数据,因此效率很低。

不,你还没有。据我了解,PersonBannerViewAddresses是两个单独的HTTP请求:一个是页面请求,另一个是通过AJAX。您的Web应用程序是无状态的,因此在每次请求时都需要加载所需的所有数据。

如果您发现确实需要性能,您可以在UI和服务之间引入一个缓存层,该缓存层将在第一次请求时缓存PersonModel并从缓存中返回在随后的请求。缓存有时会出现围绕数据陈旧性的问题,因此只有在需要时才进行探讨。