给定这个嵌套的布局结构:
~/Views/Shared/_layoutBase.cshtml ~/Views/Shared/_layout.cshtml
_layoutBase.cshtml
布局在哪里_layout.cshtml
.
布局文件中定义的任何部分都会在其下的页面中呈现其内容 ~/Views/...
但是,对于区域中的视图,从不渲染这些部分.
_layoutBase
:
<script type="text/javascript">
@RenderSection("footerScripts", false)
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
_layout.cshtml
:
@section footerScripts{
@RenderSection("footerScripts", false)
}
Run Code Online (Sandbox Code Playgroud)
"内容"观点:
@section footerScripts{
$(function () {
SetFocusOnForm("CaptchaCode", "NextButton");
});
}
Run Code Online (Sandbox Code Playgroud)
段的内容footerScripts
永远不会在区域的视图中呈现.它确实在~/Views
文件夹下的视图中呈现.
面积_ViewStart.cshtml
:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
你能看到什么问题吗?!
在现实世界中,控制器可能需要使用来自各种数据库表和其他数据存储的数据.例如:
[Authorize]
public class MembersController : Controller
{
ICourseRepository repCourse;
IUserCourseRepository repUserCourse;
IMember member;
public MembersController(ICourseRepository repCourse, IUserCourseRepository repUserCourse, IMember member)
{
this.repCourse = repCourse;
this.repUserCourse = repUserCourse;
this.member = member;
}
Run Code Online (Sandbox Code Playgroud)
所以:
我应该为每个表使用存储库吗?
我想这是agregates的概念发挥作用的地方?我应该每个聚合有一个存储库吗?
我是否只需要向Controller的构造函数添加所需数量的存储库?
这是我的设计错误的标志吗?
IMember接口本质上代表一个帮助对象,它在成员资格提供程序上放置了一个很好的面孔.即,它将所有代码放在一个地方.例如:
Guid userId;
public Guid UserId
{
get
{
if (userId == null)
{
try
{
userId = (Guid) Membership.GetUser().ProviderUserKey;
}
catch { }
}
return userId;
}
}
Run Code Online (Sandbox Code Playgroud)
这方面的一个问题肯定是缓存这种输出.我可以感受到另一个问题.
我正在使用Ninject进行DI而且在整个DI,DDD和TDD上都很畅销.好吧,有点.我也试图成为一个实用主义者......
asp.net-mvc repository ddd-repositories repository-pattern multiple-repositories
我一定是想念一些傻瓜,但这就是问题所在.
我在Transactions控制器上有一个Create动作.Create.cshtml使用jQuery通过调用$ .ajax将表单发布到服务器.调试显示所有内容都按预期到达服务器.我使用表单数据来更新记录:这也可以正常工作.然后我返回一个局部视图,将模型传递给具有默认数据的视图.我可以调试并验证模型是否传递空值和0,即我的模型的默认数据.
问题是,在响应中发送回浏览器的是旧数据......!
我没有理由看到原因.希望你能......
注意:我没有使用任何形式的输出缓存.
编辑1:
缓存不会在浏览器中发生.我说的原因是我可以在Firebug中看到对AjaxCreate Action的调用的响应.我也可以在Fiddler中看到这一点.
编辑2:
如果查看部分视图的代码,您会看到每个下拉列表或文本框的值都是@ Model.Transaction.[Property]打印在它旁边.奇怪的是,这显示了正确的值,即我的Transaction对象的默认值,但是下拉列表和文本框坚持使用发布到服务器的值,而不是每个应该呈现的属性的默认值.
我已经包含了下面的图像,因此您可以看到正在传入的每个控件右侧打印的值.然而,控件反映了在之前的$ .ajax调用中发布到服务器的旧数据.(注释显示创建视图模型时的日期时间,这样我可以看到更新的内容).
我发现用@ Html.TextBox助手替换@ Html.EditorFor(...)(参见下面的视图代码)可以解决问题.所以,似乎正在发生的事情是EditorFor助手正在引发问题.为什么?我不知道,但会发布另一个更具体的问题.
代码和标记如下:
$(document).ready(function () {
$('input[name="nextRecord"]').live('click', function () {
var theForm = $(this).closest('form');
if ((theForm).valid()) {
var buttonText = $(this).val();
var action = "/input/Transactions/AjaxCreate/";
if (buttonText === "Reset") {
clearForm(theForm);
}
else {
var targetElement = $('#CreateDiv');
var _data = theForm.serialize() + '&nextRecord=' + $(this).val();
$.ajax({
url: action,
data: _data,
cache: 'false',
type: 'POST',
dataType: 'html',
success: function (html) {
$(targetElement).html(html); …
Run Code Online (Sandbox Code Playgroud) 对于ASP.NET MVC 4应用程序,我使用Elmah.MVC 2.0.1来记录错误.
我使用NuGet安装了Elmah.MVC.它工作正常.
Elmah.MVC包不安装任何控制器或区域,因此我看不到通过Authorize属性应用安全性的明显方法,如ASP.NET MVC所推荐的那样.
我只希望Admin角色的用户能够查看Elmah页面.
我该怎么做呢?
我在ASP.NET MVC 4站点上通过NuGet安装了ELMAH.
在开发机器上,应用程序安装在根目录下.这一切都有效,并且通常是ELMAH页面.它总是这样,我的意思是开发机器上的工作,不是吗?
但是在服务器上,应用程序安装在子文件夹(〜/ tracker)中.虽然ELMAH工作正常,但页面没有样式,因此难以阅读.
我需要做些什么才能让页面变得风格化?
据推测,样式来自可以在web.config中配置的资源.但是怎么样?
我发现我收到了一个高度相关的错误:
System.Web.HttpException: A public action method 'stylesheet' was not found on controller 'Elmah.Mvc.ElmahController'.
Run Code Online (Sandbox Code Playgroud)
路径如下:
/tracker/elmah/stylesheet
Run Code Online (Sandbox Code Playgroud)
这显然与ELMAH页面源中的Link标签有关:
<link rel="stylesheet" type="text/css" href="/tracker/elmah/stylesheet" />
Run Code Online (Sandbox Code Playgroud)
但是如何配置此网址?
我使用MvcScaffolding搭建了一个控制器.
对于一个属性Model.IdCurrencyFrom,脚手架创建了一个Html.DropDownListFor:
@Html.DropDownListFor(model => model.IdCurrencyFrom,
((IEnumerable<FlatAdmin.Domain.Entities.Currency>)ViewBag.AllCurrencies).Select(option => new SelectListItem {
Text = (option == null ? "None" : option.CurrencyName),
Value = option.CurrencyId.ToString(),
Selected = (Model != null) && (option.CurrencyId == Model.IdCurrencyFrom)
}), "Choose...")
Run Code Online (Sandbox Code Playgroud)
无论是使用新记录还是编辑现有记录,这都可以正常工作.
只有3种货币,AR $,US $和GB£.因此,我想要一个ListBox而不是下拉列表.
所以我把上面改为:
@Html.ListBoxFor(model => model.IdCurrencyFrom,
((IEnumerable<FlatAdmin.Domain.Entities.Currency>)ViewBag.AllCurrencies).Select(option => new SelectListItem {
Text = (option == null ? "None" : option.CurrencyName),
Value = option.CurrencyId.ToString(),
Selected = (Model != null) && (option.CurrencyId == Model.IdCurrencyFrom)
}))
Run Code Online (Sandbox Code Playgroud)
我现在得到一个ArgumentNullException,参数名称:source,但仅在编辑现有记录时.创建新记录,这很好.
怎么了?!
什么也没有变.切换回DropDownListFor,一切正常.切换到ListBox(而不是ListBoxFor),我得到错误.
该模型不为null(就像我说的,它适用于DropDownListFor)...而且我的想法已经用完了.
asp.net-mvc asp.net-mvc-3 asp.net-mvc-scaffolding html.listboxfor
使用@Html.EditorFor(model =>model.IsClient)
,其中IsClient是布尔值,使用Not Set, Yes and No
选项呈现下拉列表.
一切都很好.
现在我想将knockoutjs与我喜欢的结果下拉列表一起使用,那么如何使用@ Html.EditorFor添加data-bind属性,我需要使用knockoutjs来处理这个下拉列表?
我试过了:
@Html.EditorFor(model => model.IsClient, new Dictionary<string, object> { { "data-bind", "value: Account.IsClient" } })
Run Code Online (Sandbox Code Playgroud)
但是,它使用对象additionalViewData参数,并且它不呈现data-bind属性.这可能很自然,因为此参数可能与渲染标记的Html属性无关.
但是,找不到任何合理的文档,并且没有其他重载看起来可能是我想要的候选者.
TIA有什么建议.
我有一个带圆角的简单盒子,它有一个标题,并根据文本的数量进行扩展,如Dan Cederholm的Bullet Proof Web Design(ISBN 0-321-34693-9)中所述.
效果很好,除了放大谷歌浏览器外.然后框的右边缘消失.
它可以在IE和FireFox中正常运行.
在chrome中,它在缩放110%和其他缩放时也失败了.在IE或FireFox中没有问题.
是什么原因引起了这个?
一般来说,是什么让布局变焦敏感(如果存在任何这样的一般规则......)?
Dan Cederholm的书真的是防弹......?
我正在使用ASP.NET MVC 4,使用mvcSiteMapProvider来管理我的菜单.
我有一个自定义菜单构建器,用于评估节点是否在当前分支上(即,如果SiteMap.CurrentNode
是CurrentNode或CurrentNode是否嵌套在它下面).代码包含在下面,但基本上检查每个节点的url并将其与currentnode的url进行比较,直到currentnodes"family tree".
我的自定义菜单构建器使用CurrentBranch添加一个类,该类突出显示CurrentBranch上的菜单项.
我的自定义菜单工作正常,但我发现,mvcSiteMapProvider
似乎没有评估url
的CurrentNode
以一致的方式:
当两个节点指向同一个操作并且仅通过操作的参数进行区分时,SiteMap.CurrentNode似乎不使用正确的路径(它忽略区分参数并默认为映射到中定义的操作的第一个路径)节点).
在我的应用程序中Members
.
会员的MemberStatus
字段可以是"未处理","活动"或"非活动".要更改MemberStatus,我ProcessMemberController
在一个名为Admin的区域中有一个.使用上的Process
操作完成处理ProcessMemberController
.
我的mvcSiteMap有两个节点,它们都映射到Process
动作.它们之间的唯一区别是alternate
参数(例如我的客户端的域语义),在一种情况下,其值为"已处理",而在另一种情况下为"未处理":
节点:
<mvcSiteMapNode title="Process" area="Admin" controller="ProcessMembers" action="Process" alternate="Unprocessed" />
<mvcSiteMapNode title="Change Status" area="Admin" controller="ProcessMembers" action="Process" alternate="Processed" />
Run Code Online (Sandbox Code Playgroud)
路线:
这两个节点的相应路由(同样,区别它们的唯一方法是备用参数的值):
context.MapRoute(
"Process_New_Members",
"Admin/Unprocessed/Process/{MemberId}",
new { controller = "ProcessMembers",
action = "Process",
alternate="Unprocessed",
MemberId = UrlParameter.Optional }
);
context.MapRoute(
"Change_Status_Old_Members",
"Admin/Members/Status/Change/{MemberId}",
new { controller = "ProcessMembers",
action …
Run Code Online (Sandbox Code Playgroud) ViewBag动态属性似乎存在问题.让我们说:
@{
ViewBag.Title = @Model.CourseName;
}
Run Code Online (Sandbox Code Playgroud)
然后在页面上我有一个表格:
@Html.TextBox("Title", null, new {style="width:400px;"})
Run Code Online (Sandbox Code Playgroud)
其中Title是数据库表中字段的名称.
首次打开页面时,ID为"Title"的文本框将获取ViewBag.Title动态属性的值.
我对模型绑定的确切细节有点模糊,但这似乎是一个错误,或者如果没有,如果它是由于绑定过程而自然发生的事情,那么警告它会很好这个.
我找到的工作是将ViewBag属性重命名为:
@{
ViewBag.Titulo = @Model.CourseName;
}
Run Code Online (Sandbox Code Playgroud)
(标题改为Titulo - 总是很高兴知道另一种语言以避免姓名冲突......)
问题消失了.
但问题是:
这种行为是期待的吗?这个漏洞很容易找到(花了一个小时来弄清楚,包括写这个问题),但我怀疑其他漏洞可能更多,嗯,晦涩难懂.
解释这个问题:
Model Binder是否自动绑定它在ViewBag中找到的属性?即使强类型ViewModel中存在现有属性,我已经传递到页面?当然ViewModel应该优先考虑吗?
asp.net-mvc ×2
elmah ×2
elmah.mvc ×2
css ×1
jquery ×1
knockout.js ×1
name-clash ×1
page-zoom ×1
razor ×1
repository ×1
viewbag ×1