簡體   English   中英

Asp.Net MVC布局和部分視圖

[英]Asp.Net MVC layout and partial views

讓我們考慮兩個使用相同布局的視圖:

  • 包含“body”的左列(兩個視圖的填充方式不同)
  • 右列顯示一般信息(通過模型傳遞)

而不是兩次定義正確的部分,我想知道我是否可以創建一個PartialView直接從布局頁面鏈接。

問題是部分視圖從正在呈現的視圖中隱含地繼承了它們的模型。 由於每個視圖都有自己的模型,因此我在局部視圖中最終會出現模型類型不匹配的情況。

從這里我看到兩個解決方案:

  • 我可以在ViewBag中插入視圖模型的公共部分。 不幸的是,這意味着使用此布局的每個視圖都必須實現此“約定”,但在編譯時沒有任何內容警告開發人員...
  • 我可以使用多態來使每個視圖模型繼承自部分視圖使用的相同基類(編輯:或接口)。 這將在一定程度上起作用,但只要我在同一布局中有第二個局部視圖,就可能以指數方式增加復雜性。

所以這里是問題:

  • 我是否正確上述假設?
  • 你還有其他可能嗎?
  • 對此有何回報?

非常感謝,TB。

使用一個Interface並在兩個模型上實現它,這正是他們用來做的事情。

以下是使用兩個不同模型實現接口的兩個不同視圖的示例。 這是子類型而不是ad-hoc多態

public class ViewModelOne : IReusableView
{
    public string Name { get; set; }
    public string Something { get; set; }
    public int ANumber { get; set; }
}

public class ViewModelTwo : IReusableView
{
    public string Name { get; set; }
    public string Thing { get; set; }
    public string SomethingElse { get; set; }
    public int ANumber2 { get; set; }
}

public interface IReusableView
{
    string Name { get; }
}

所以我們這里有一個非常簡單的局部視圖,即'InnerPartialView':

@model TestIntegration.Models.IReusableView
<div>
    @Model.Name
</div>

哪個用於家庭和這個示例控制器的頁面:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View(new ViewModelOne() { Name = "hello", Something="sdfsdfs", ANumber = 1 });
        }

        public ActionResult About()
        {
            return View(new ViewModelTwo() { Name = "hello 2", SomethingElse = "aaaddd", ANumber2 = 10, Thing="rand" });
        }
    }

主頁視圖:

@model TestIntegration.Models.ViewModelOne
@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
    @Html.Partial("InnerPartialView")
</p>

關於觀點:

@model TestIntegration.Models.ViewModelTwo
@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
         @Html.Partial("InnerPartialView")
</p>

渲染局部視圖時,可以向其發送模型:

@Html.RenderPartial(MVC.Partials.Views.Sidebar, Model.SideBarModel);

因此,您可以將數據作為父模型的一部分發送,該模型是部分側邊欄的模型。

在部分視圖中,模型屬於dynamic類型,因此您無需知道它們的類型。 但是,您只需確保模型具有您需要的屬性。 換句話說,你可以使用Model.MyPropertyModel.MyProperty作為MyPropertyType使用時Html.Partial

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM