Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC 3应用程序中处理类别部分视图的最佳方法_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC 3应用程序中处理类别部分视图的最佳方法

Asp.net mvc 在ASP.NET MVC 3应用程序中处理类别部分视图的最佳方法,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我在一个查找表中列出了博客文章类别(~20)。 我想在多个页面上显示它们,作为用户可以单击的超链接列表。 我还想在两个或更多位置(不同的查看页面)的下拉列表中显示它们 下面的工作&我将类别视为超链接的菜单/列表。 但这将导致我修改需要显示类别的多个控制器。 处理这个问题的最佳实践是什么,这样我的代码更改最少 //#1 I added new class in one of my model: namespace MyApp.Models { ... public class Show

我在一个查找表中列出了博客文章类别(~20)。 我想在多个页面上显示它们,作为用户可以单击的超链接列表。 我还想在两个或更多位置(不同的查看页面)的下拉列表中显示它们

下面的工作&我将类别视为超链接的菜单/列表。 但这将导致我修改需要显示类别的多个控制器。 处理这个问题的最佳实践是什么,这样我的代码更改最少

//#1 I added new class in one of my model:
namespace MyApp.Models
{
   ...
   public class ShowPostModel
   {
      public Post Post { get; set; }
      public IEnumerable<Category> Categories { get; set; }
   }
   public class Category
   {
      public string _id { get; set; }
      public string Name { get; set; }      
   }
}

//#2 Populating the controller
namespace MyApp.Controllers
{
  public class BlogController : Controller
  {
    public ActionResult ShowPost()
    {
        ShowPostModel viewModel = new ShowPostModel();
        viewModel.Post = ReadBlogPostFromDB();
        viewModel.Categories = ReadCategoriesFromDB();
        return View(viewModel);
    }
  }
}

//#3 This is from my main view for showing the Post:
@Html.Partial("_Categories", Model.Categories)

//#4 This is my _Categories partial view:
@model IEnumerable<MyApp.Models.Category>
<section>
   <header><b>Categories</b></header>
   <ul style="padding:0;margin:0;">
      @foreach (var cat in Model)
      {
        <li>
           <a href="/post/browse/cid=@cat._id">@cat.Name</a>
        </li>
      }
   </ul>
 </section>
//#3强制所有需要从基本控制器继承类别的控制器

public class BlogController : BlogBaseController
//#4.改变我的观点

@Html.Partial("_Categories", (IEnumerable<MyApp.Models.Category>)@ViewBag.Categories)
@Html.Partial(“_Categories”,(IEnumerable)@ViewBag.Categories)

您可能希望尝试为模板创建两个显示,一个显示在链接中,另一个显示在下拉列表中。根据您告诉视图使用特定模板的页面而定。

如果在足够的位置使用类别,则可以将其封装到基本控制器类中,并重写OnActionExecuted


然后,我会将类别放入ViewBag上的一个属性中,并从那里将其传递到局部视图中,并保留视图的模型。

您可以创建一个过滤器来填充类别并将其添加到ViewData/ViewBag。然后,可以将此筛选器应用于需要类别的控制器/操作

对于显示,您可以使用EditorTemplates或Partials保持UI代码干燥


HTH.

我想知道为什么没有人建议使用渲染。您可以在基本控制器中编写此操作方法。这将使其在所有派生控制器中可用。通过这种方式,您可以将类别视图强类型化。此外,您应该将Categories视图放在Views/Shared目录中,这样每个控制器都可以访问该视图。这样做将使您保持干爽,并且您仍然拥有强类型视图的好处。 编辑通过这种方式,您不必使用基本控制器来使用渲染。虽然上述方法是有效的,我更喜欢这样做,但你也可以有一个像

Public NavigationController:Controller()
{
     public ActionResult Categories()
    {
        var Categories = FetchFromDB();
        return View(Categoires);
    }
}

现在,您可以在应用程序中的任意位置使用renderAction调用此操作方法,您可以使用ViewData对象存储其他相关数据,例如类别列表,您可以在视图/局部视图中引用这些数据,但是@Michael已经很好地介绍了这些数据。@leonxki:这仍然需要我在需要可用类别的地方更改每个控制器。这很好。但我主要关心的是分类代码放在哪里?修改每个控制器看起来很糟糕,而且没有干涸通过修改每个控制器,您的意思是这样做吗;viewModel.Categories=ReadCategoriesFromDB();在每个控制器中?如果是,为什么不从模型中调用该函数,这样就不必从控制器中调用它呢?我在代码中对控制器和模型进行了修改。在我的模型中,我必须在另一个模型类中添加Category类和IEnumerable。然后在控制器中,我必须填充List(),以便视图可以读取它。不确定我是否遵循了您的方法。Thanks@zahid他可能想把它作为一个PartialView归还,因此,它可以在后期视图中呈现。@frennky例如,当您在共享视图中有类别操作和相应视图时,您可以将其称为renderpartial,前提是您在调用视图中有可用的模型数据,如的示例所示Posts@Projapati你到底没有遵循什么+1是的,我同意这一点,并且做了完全相同的事情。另一方面,我的同事更喜欢在每个控制器中使用重复的代码。这是偏好的问题。是的,这可能会返回部分视图,并具有
[ChildActionOnly]
属性。
Public NavigationController:Controller()
{
     public ActionResult Categories()
    {
        var Categories = FetchFromDB();
        return View(Categoires);
    }
}