我知道视图中不应该包含代码,但在我正在处理的项目中,我在视图中有很多逻辑.
我的主页有
<% Html.RenderPartial("SearchResults"); %>
Run Code Online (Sandbox Code Playgroud)
现在在局部视图中,我有很多这样的逻辑;
<div id="RestaurantsList">
<%if (Model.restaurantsList.Count() > 0)
{
foreach (var item in Model.restaurantsList)
{ %>
<% Html.RenderPartial("SearchResult", item); %>
<%
} %>
<%
}
else
{
Html.RenderPartial("NoResults");
} %>
Run Code Online (Sandbox Code Playgroud)
现在我可以让家庭控制器返回一个基于列表为空的不同视图,但我真的不想这样,因为索引视图有一些我想要显示的东西,无论是否有结果.
我能想到的另一件事就是将它封装在一个辅助方法中,比如Html.SearchResults.但是我需要帮助器来为每个搜索结果调用renderPartial.这似乎不是关心的干净分离.
我仍然需要在局部视图中使用第一个if语句.
你最好怎么处理这个?
我有一个侧边栏,里面会有一些逻辑,类似于视图与控制器的对话方式.我在哪里把逻辑放入部分?我是否为布局创建了一个新控制器并将其放入其中?
该布局适用于登录用户,如仪表板.仪表板将有一个侧边栏,在每个页面上显示相同的动态内容.由于它显示在每个页面上,我想把它放在一个部分.
我只是把发现和所有信息放在哪里感到困惑.
我有一个局部视图和int it,没有任何布局的任何继承的痕迹.但是每当我想在视图中使用它(渲染它)时,布局会为视图重复一次,而对于局部视图则重复一次.这篇文章建议创建一个空的布局.但我认为这是解决方法.无论如何都要停止为部分视图加载布局(主布局).我不明白,为什么当没有代码使用主布局时,为什么要加载它.这就像在ASP.NET中创建一个页面,并看到它从没有<%@ Master ...指令的母版页继承.
这是我的部分观点:
@* Recursive category rendering *@
@using Backend.Models;
@{
List<Category> categories = new ThoughtResultsEntities().Categories.ToList();
int level = 1;
}
@RenderCategoriesDropDown(categories, level)
@helper RenderCategoriesDropDown(List<Category> categories, int level)
{
List<Category> rootCategories = categories.Where(c => c.ParentId == null).ToList();
<select id='categoriesList' name='categoriesList'>
@foreach (Category rootCategory in rootCategories)
{
<option value='@rootCategory.Id' class='level-1'>@rootCategory.Title</option>
@RenderChildCategories(categories, level, rootCategory.Id);
}
</select>
}
@helper RenderChildCategories(List<Category> categories, int level, int parentCategoryId)
{
string padding = string.Empty;
level++;
List<Category> childCategories = categories.Where(c => c.ParentId …Run Code Online (Sandbox Code Playgroud) 我是MVC的新手,我不明白如何正确使用部分视图.我正在尝试在我的MVC应用程序中显示来自博客站点的RSS源.我正在使用Razor,我有以下结构:
Controllers/HomeController.cs
Controllers/RssController.cs
Views/Home/Index.cshtml
Shared/_Layout.cshtml
Shared/_Rss.cshtml
Run Code Online (Sandbox Code Playgroud)
HomeController的:
namespace MvcApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
}
}
Run Code Online (Sandbox Code Playgroud)
RssController:
namespace MvcApp.Controllers
{
public class RSSFeedController : Controller
{
public ActionResult RssFeed()
{
string strFeed = "http://foo.wordpress.com/category/foo/feed/";
using (XmlReader reader = XmlReader.Create(strFeed))
{
SyndicationFeed rssData = SyndicationFeed.Load(reader);
return View(rssData);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
_Rss.cshtml:
@using System.ServiceModel.Syndication;
@using System.Text;
@using System.Xml.Linq;
<h2>RSSFeed</h2>
@foreach (var item in ViewData.Model.Items)
{
string …Run Code Online (Sandbox Code Playgroud) 我很好奇在一个回复到包含部分View的表单中使用多个强类型部分的方法是否是正确的MVC处理方法.为简洁起见,主视图与以下模型绑定,其中包含其他几个属性和数据注释:
public class AccountSetup : ViewModelBase
{
public bool TermsAccepted { get; set; }
public UserLogin UserLogin { get; set; }
public SecurityQuestions SecurityQuestions { get; set; }
}
public class UserLogin
{
public string LoginId { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
主Register.cshtml视图的标记并不完全在下面,但这是部分在下面使用的方式:
@model Models.Account.AccountSetup
. . . <pretty markup> . . .
@using (Html.BeginForm("Register", "Account", FormMethod.Post))
{
. . . <other fields and pretty markup> . . .
@Html.Partial("_LoginAccount", Model.UserLogin)
@Html.Partial("_SecurityQuestions", Model.SecurityQuestions)
<input …Run Code Online (Sandbox Code Playgroud) 让我们考虑两个使用相同布局的视图:
而不是两次定义正确的部分,我想知道我是否可以创建一个PartialView直接从布局页面链接.
问题是部分视图从正在呈现的视图中隐含地继承了它们的模型.由于每个视图都有自己的模型,因此我在局部视图中最终会出现模型类型不匹配的情况.
从这里我看到两个解决方案:
所以这里是问题:
非常感谢,TB.
我有一个视图,采用PaginatedList(如在Nerd Dinner样本中).该页面按预期工作.现在我添加了一个部分视图,它采用相同的PaginatedList,并在第一个视图中调用RnederPartial.ASP.NET抛出了一个我似乎无法解决的异常.
PaginatedList代码:
public class PaginatedList<T> : List<T>
{
public int PageIndex { get; private set; }
public int PageSize { get; private set; }
public int TotalCount { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
PageSize = pageSize;
TotalCount = source.Count();
TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 0);
}
}
public …Run Code Online (Sandbox Code Playgroud) 有没有办法动态注入部分模板(并在Ruby和Javascript中以相同的方式工作)?基本上,我正在尝试在列表中呈现不同类型的对象.
我能想到的最好的是:
<div class="items">
{{#items}}
<div class="item">
{{#is_message}}
{{> message}}
{{/is_message}}
{{#is_picture}}
{{> picture}}
{{/is_picture}}
</div>
{{/items}}
</div>
Run Code Online (Sandbox Code Playgroud)
我对这种方法并不十分兴奋.有没有更好的办法?
另请注意,视图的不同类型的模型可以具有不相似的字段.我想我总是可以去最低的公分母并且数据哈希包含html,但是我宁愿使用胡子模板.
此代码是从本教程中的一些ASP.Net MVC 2代码转换而来的:
带有DateTime的MVC 2编辑器模板
它是存储为"EditorTemplates/DateTime.cshtml"的DateTime字段的自定义EditorTemplate.
@Model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })
Run Code Online (Sandbox Code Playgroud)
但是,使用时出现以下错误@Html.EditorFor(model => model.NewAbsence.StartDate):
CS1973:'System.Web.Mvc.HtmlHelper'没有名为'TextBox'的适用方法,但似乎有一个名称的扩展方法.无法动态分派扩展方法.考虑转换动态参数或调用扩展方法而不使用扩展方法语法.
我在这里看过一些类似的帖子,提到了转换EditorFor方法的参数,但是我似乎无法在我的例子中使用它.
有人可以指出我需要在我的代码中更改.谢谢.
我无法决定是否应该使用htmlHelper或部分视图来解决我的问题.
我想重用以下代码:
<div style="width: 500px; float: left;">
<div class="box effect2">
<span><a href="@Url.Action("someMethod", "somController")">
<img src="@Url.Content("~someurl)" /></a></span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
href和图像源将是参数.
最好的方法是什么?
partial-views ×10
asp.net-mvc ×5
layout ×2
razor ×2
c# ×1
html-helper ×1
javascript ×1
master-pages ×1
refactoring ×1
ruby ×1
templates ×1
viewbag ×1