任何人都可以给我一个关于ModelState在Asp.net MVC中的角色的简洁定义(或者链接到一个).特别是我需要知道在什么情况下打电话是必要的或可取的ModelState.Clear()
.
有点开放了 ......对不起,我想如果告诉你我在做什么可能会有所帮助:
我在一个名为"Page"的控制器上有一个Edit of Action.当我第一次看到表单更改页面的详细信息时,所有内容都很好地加载(绑定到"MyCmsPage"对象).然后,我单击一个按钮,为MyCmsPage对象的某个字段(MyCmsPage.SeoTitle
)生成一个值.它生成正常并更新对象,然后我返回动作结果与新修改的页面对象,并期望相关的文本框(使用渲染<%= Html.TextBox("seoTitle", page.SeoTitle)%>
)更新...但是它显示了加载的旧模型的值.
我通过使用来解决它,ModelState.Clear()
但我需要知道它为什么/如何工作所以我不只是盲目地做.
的PageController:
[AcceptVerbs("POST")]
public ActionResult Edit(MyCmsPage page, string submitButton)
{
// add the seoTitle to the current page object
page.GenerateSeoTitle();
// why must I do this?
ModelState.Clear();
// return the modified page object
return View(page);
}
Run Code Online (Sandbox Code Playgroud)
ASPX:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyCmsPage>" %>
....
<div class="c">
<label for="seoTitle">
Seo Title</label>
<%= Html.TextBox("seoTitle", page.SeoTitle)%>
<input type="submit" value="Generate Seo Title" name="submitButton" />
</div>
Run Code Online (Sandbox Code Playgroud) 我是使用ASP.NET MVC开发Web应用程序的新手.事实上,无论技术如何,我都很擅长开发网络应用程序.
目前,我正在开展一个项目,以便更好地了解ASP.NET MVC框架.当阅读SO和互联网上的其他地方时,共识似乎是视图永远不应直接处理业务对象(即实现业务逻辑和包含相关属性的对象).相反,应该使用视图模型.但是,这引入了一些问题:
事实上,它似乎相当麻烦,我没有真正看到任何人正确解释为什么将业务对象传递给视图是一个坏主意.有人可以尝试解释一下(或指向一个很好的解释)?
只是一个澄清 ; 我不是在寻找如何处理上述视图模型的两个问题的示例,而只是解释为什么我应该使用视图模型.
我已经阅读了一些有关贫血领域模型和关注点分离的问题.在贫血域对象上执行/附加域逻辑的最佳技术是什么?在我的工作中,我们有一个非常贫穷的模型,我们目前正在使用"帮助程序"类来执行域对象上的数据库/业务逻辑.例如:
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
Run Code Online (Sandbox Code Playgroud)
当应用程序需要购买时,它将创建StoreHelper,并在域对象上调用该方法.对我而言,客户/产品知道如何将自己保存到存储库是有意义的,但您可能不希望在域对象上使用Save()方法.对于像Customer.Purchase(Product)这样的方法也有意义,但这就是将域逻辑放在实体上.
以下是我遇到的一些技巧,不确定哪些是好/坏:
处理此问题的最佳技巧是什么?我对DDD很新(我正在阅读埃文斯的书 - 所以也许这会打开我的眼睛)
基本上是处理基于订阅的服务的低级"管道"代码的东西.我看到许多涉及基本会员资格的事情,但没有处理订阅方面的事情(定期计费,设置计费的自动化工作,计费通知等).这可能是让我不能使用ASP.NET MVC来实现我的SaaS理念的一件事,因为编写自己的开发时间需要相当长的时间.如果我选择其他选项,Ruby on Rails,我可以购买一个套装,以250美元的价格完成所有这些工作.我还没有找到任何与.NET相关的东西 - 我见过的所有SaaS示例应用程序更像是StackOverflow等所有你有一个多人登录的站点,而不是你所在的Web应用程序模型订阅者每月收费,每个订户都有自己网站的用户和其他实体(例如客户,任务等).
有什么类似的ASP.NET,或者我必须编写自己的某些指导原则,所以我不浪费太多时间?作为一个创业公司,这意味着我自己正在做所有的编码.
我发现了这一点,但它似乎只是为了计费而且似乎没有太多(任何?)文档关于如何设置它.
使用LINQ TO SQL作为基于存储库的解决方案的基础.我的实现如下:
IRepository
FindAll
FindByID
Insert
Update
Delete
Run Code Online (Sandbox Code Playgroud)
然后我有扩展方法,用于查询结果:
WhereSomethingEqualsTrue() ...
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
我的用户存储库有N个角色.我是否创建了角色存储库来管理角色?我担心,如果我走这条路,我最终会创建几十个存储库(每个表几个,除了连接表).每个表的存储库是否常见?
c# design-patterns domain-driven-design repository linq-to-sql
我IQueryable<T>
在我的应用程序中使用接口,并推迟在DB上执行SQL,直到像这样的方法.ToList()
我有时需要找到某些列表的计数 - 而不需要使用列表中的数据进行计数.根据我的SQL经验,我知道SQL COUNT()的工作量远远少于返回所有行的等效SELECT语句.
所以我的问题是:不会是在DB工作少,从返回计数IQueryable<T>
的Count()
不是呈现方法IQueryable<T>
到列表并调用列表的Count()
方法是什么?
我怀疑它将会ToList()
激活SELECT sql,然后在单独的查询中计算行数.我希望Count()
在IQueryable<T>
简单地为sql COUNT()查询呈现sql.但我不确定.你知道吗?
我想创建一个方法来接受Expression<Func<T, bool>>
并创建它的逻辑逆(即它将返回它将返回的false
位置true
,反之亦然.这比我想象的要困难得多.这是我所要做的:
public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expression)
{
return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body));
}
Run Code Online (Sandbox Code Playgroud)
这编译很好但在调用时会抛出以下异常:
Test method Tests.Common.Unit.LinqPredicateBuilderTests.CanInverseAPredicate threw exception:
System.ArgumentException: Incorrect number of parameters supplied for lambda declaration
Run Code Online (Sandbox Code Playgroud)
我不知道我在做什么.任何人都可以填补空白吗?
目前我有以下操作从我的数据库返回文件(图像,PDF等):
//
// GET: /FileManager/GetFile/ID
[OutputCache(Duration = 600, VaryByParam = "ID")]
public ActionResult GetFile(int ID)
{
FileService svc = new FileService(new SqlFileRepository(base.ConnectionString));
KsisOnline.Data.File result = svc.GetFileByID(ID);
return File(result.Data, result.MimeType, result.UploadFileName);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用该OutputCache
属性,但我不知道我是否正确使用它或如何为此目的优化它.
正如代码所示,我似乎在Firefox(3)中获得了缓存功能,但不是IE(7).出于某种原因,IE每次都要从DB请求图像(这显然是杀手很糟糕),我不知道如何修复它.当然IE不能正确支持标准,但我可能仍然没有遵循一些首选的缓存约定.我真的很感激一些帮助,所以我得到最小的数据库命中和缓存支持跨浏览器.
编辑: 要查看上面的代码或使用浏览器/工具自行配置,请参阅此链接.
Firefox(以及我认为的其他浏览器)在您单击"停止"按钮或通过Escape键调用它时会停止gif动画.
我有一个文本输入,在更改时使ajax请求更新其他元素.作为这个ajaxyness的一部分,我有一个动画GIF来显示反馈.
我还在此输入中捕获转义键,以便清除文本字段以获得更好的UX.
我的问题是在按下一次转义键之后,没有任何ajax GIF动画,直到刷新页面为止.有没有人知道解决方法?
我在功能处理中尝试了e.stopPropagation();
并且似乎没有用.我怀疑这会停止触发更多js事件,浏览器会捕获转义而不管js活动.e.cancelBubble = true;
e.keyCode == 27
我通过添加/删除css类来显示/隐藏gif,因此很难应用"更改gif url重置"解决方法.我甚至不知道这是否有效 - 没有测试它.但似乎很难.如果有人知道这是有效的,并且知道用background-image: url(../images/ajax-loader_dotcirclel13x13.gif);
css 应用hack的简单方法那么请告诉我.
我有可能被视为奇怪的混合IQueryable<T>
和IList<T>
域对象集合传递给我的应用程序堆栈.我试图保持尽可能多的"迟到查询"或"延迟加载".我这样做有两种方式:
IQueryable<T>
存储库传递到我的应用层.IList<T>
s后,但是对象/聚合图中的某些元素与代理"链接"以便推迟加载.有时甚至委托内容依赖于IQueryable<T>
源和DataContext
注入.到目前为止,这对我有用.
令人难以置信的是证明这种设计确实有效.IE浏览器.如果我在某个地方击败'懒惰'部分并且我的评估/执行发生得很早,那么整个事情就是浪费时间.我想以某种方式TDD这个.
我不太了解委托或线程安全,因为它适用于代理人在同一来源上行事.我希望能够模拟DataContext
并以某种方式跟踪延迟(IQueryable<T>
的SQL和委托)加载的两种方法,以便我可以进行测试,证明两个函数都在app/stack的不同级别/层工作.
由于延迟对于设计有任何价值至关重要,我希望当我在给定级别上破坏设计时(与实时实现分开),测试失败.这可能吗?
asp.net-mvc ×4
c# ×2
firefox ×2
linq ×2
linq-to-sql ×2
ajax ×1
animated-gif ×1
browser ×1
caching ×1
delegates ×1
iqueryable ×1
jquery ×1
modelstate ×1
multi-tenant ×1
performance ×1
repository ×1
saas ×1
sql ×1
tdd ×1
testing ×1
viewmodel ×1