当我在MVC 2预览1中使用DataAnnotation验证时,如何在验证实体时测试我的控制器操作是否在ModelState中放置了正确的错误?
一些代码来说明.一,行动:
[HttpPost]
public ActionResult Index(BlogPost b)
{
if(ModelState.IsValid)
{
_blogService.Insert(b);
return(View("Success", b));
}
return View(b);
}
Run Code Online (Sandbox Code Playgroud)
这是一个失败的单元测试,我认为应该通过但不是(使用MbUnit和Moq):
[Test]
public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error()
{
// arrange
var mockRepository = new Mock<IBlogPostSVC>();
var homeController = new HomeController(mockRepository.Object);
// act
var p = new BlogPost { Title = "test" }; // date and content should be required
homeController.Index(p);
// assert
Assert.IsTrue(!homeController.ModelState.IsValid);
}
Run Code Online (Sandbox Code Playgroud)
我想除了这个问题,应该我来测试验证,并应在我这种方式测试它?
Html.RadioButtonListASP.NET MVC Futures中有一个扩展方法.有没有人找到强类型版本的代码RadioButtonListFor<T>.它在视图中看起来像这样:
<%= Html.RadioButtonListFor(model=>model.Item,Model.ItemList) %>
Run Code Online (Sandbox Code Playgroud) 几天前我问了这个问题:
我在同一个控制器动作中同时发出六个jQuery async ajax请求.每个请求需要10秒才能返回.
通过调试和记录对action方法的请求,我注意到请求是序列化的,并且永远不会并行运行.即我在我的log4net日志中看到一个时间轴,如下所示:
2010-12-13 13:25:06,633 [11164] INFO - Got:1156 2010-12-13 13:25:16,634 [11164] INFO - Returning:1156 2010-12-13 13:25:16,770 [7124] INFO - Got:1426 2010-12-13 13:25:26,772 [7124] INFO - Returning:1426 2010-12-13 13:25:26,925 [11164] INFO - Got:1912 2010-12-13 13:25:36,926 [11164] INFO - Returning:1912 2010-12-13 13:25:37,096 [9812] INFO - Got:1913 2010-12-13 13:25:47,098 [9812] INFO - Returning:1913 2010-12-13 13:25:47,283 [7124] INFO - Got:2002 2010-12-13 13:25:57,285 [7124] INFO - Returning:2002 2010-12-13 13:25:57,424 [11164] INFO - Got:1308 2010-12-13 13:26:07,425 [11164] INFO - Returning:1308
查看FireFox中的网络时间线,我看到了: …
在尝试让我的应用程序正确生成404错误时,我在路由表的末尾实现了catch all route,如下所示:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
Run Code Online (Sandbox Code Playgroud)
但是,为了使这个工作,我不得不删除默认路由:
{controller}/action/{id}
Run Code Online (Sandbox Code Playgroud)
但是现在已经删除了默认设置,我的大部分操作链接都不再有效,而我找到让它们再次工作的唯一方法是为每个控制器/操作添加单独的路由.
是否有更简单的方法,而不是为每个控制器/操作添加路由?
是否可以创建一个默认路由,如果用户尝试导航到未知路由,仍然允许捕获所有路由?
当我尝试使用Asp.Net MVC 2中的创建样式操作创建实体时,会发生这种情况.
POCO具有以下特性:
public int Id {get;set;}
[Required]
public string Message {get; set}
Run Code Online (Sandbox Code Playgroud)
在创建实体时,会自动设置Id,因此在Create操作中不需要它.
ModelState表示"需要Id字段",但我没有将其设置为如此.这里有自动发生的事吗?
编辑 - 原因显示
Brad Wilson通过Paul Speranza在下面的一条评论中回答了这个问题的原因,他说(欢呼保罗):
你提供了身份证的价值,你只是不知道你是谁.它位于默认路由的路由数据中("{controller}/{action}/{id}"),其默认值为空字符串,对int无效.使用action参数的[Bind]属性排除ID.我的默认路由是:new {controller ="Customer",action ="Edit",id =""} //参数默认值
编辑 - 更新模型技术
我实际上通过使用TryUpdateModel和与之相关的exclude参数数组改变了我再次这样做的方式.
[HttpPost]
public ActionResult Add(Venue collection)
{
Venue venue = new Venue();
if (TryUpdateModel(venue, null, null, new[] { "Id" }))
{
_service.Add(venue);
return RedirectToAction("Index", "Manage");
}
return View(collection);
}
Run Code Online (Sandbox Code Playgroud) 我有一个JsonResult工作正常,并从一些POCO返回JSON.我想将JSON保存为DB中的字符串.
public JsonResult GetJSON()
{
JsonResult json = new JsonResult
{
Data = GetSomPocos()
};
return json;
}
Run Code Online (Sandbox Code Playgroud)
我需要审核响应,所以我想将其保存json到数据库中.我找不到将JSON作为字符串的方法.
任何帮助表示赞赏.
我对如何连接MvcHtmlString实例有一些疑问,因为在MSDN中找到了这些信息:
MvcHtmlString类表示不应再次编码的HTML编码字符串
使用这样的代码时,我冒险将字符串HTML编码两次:
var label = Html.LabelFor(model => model.Email);
var textbox = Html.TextBoxFor(model => model.Email);
var validation = Html.ValidationMessageFor(model => model.Email);
var result = MvcHtmlString.Create(
label.ToString() + textbox.ToString() + validation.ToString());
Run Code Online (Sandbox Code Playgroud)
(注意:这应该进入HtmlHelper扩展方法以减少视图中的代码重复).
我正在使用ASP.NET MVC 3来构建Web应用程序.
我想要做的是在两个控制器之间传递值,虽然有很多方法可以做到这一点我特别感兴趣的是使用TempData它.
public ActionResult Action1()
{
string someMessage;
Test obj = SomeOperation();
if(obj.Valid)
{
someMessage = obj.UserName;
}
else
{
someMessage = obj.ModeratorName;
}
TempData["message"] = someMessage;
return RedirectToAction("Index");
}
public ActionResult Index()
{
ViewBag.Message = TempData["message"]
return View();
}
Run Code Online (Sandbox Code Playgroud)
那么TempData这里的使用是否正确?我的意思是在最好的编程实践中使用这种正确的方法TempData吗?
在什么时候应该TempData使用案例?
注意:我已经通过以下链接
谢谢
我收到一个错误:
"路径'/favicon.ico'的控制器未找到或未实现IController"
然后我想:框架如何知道它有哪些文件来实例化控制器,因为脚本,css和其他文件也是如此?
(从来没有想到这一点,但现在,favicon正在抱怨,我在想......)
但回到错误,为什么会发生这种情况?
这个让我难过,我有一个强类型的视图,有这个循环生成radiobuttons:
<% foreach (QuestionAnswer qa in Model.QuestionAnswers)
{ %>
<%= Html.RadioButtonFor(model => model.QuestionAnswers[(int)qa.QuestionID - 1].AnswerValue, "Checked" ) %>
<%= Html.Encode(qa.OptionValue) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
它渲染得很好,但由于名称不一样,你可以选择1个以上的radiobutton.如何对它们进行分组,这样才能选择1个单选按钮?
任何帮助,将不胜感激!
asp.net-mvc-2 ×10
asp.net-mvc ×7
asp.net ×3
c# ×2
ajax ×1
html-helper ×1
javascript ×1
jquery ×1
json ×1
tdd ×1
tempdata ×1
unit-testing ×1
validation ×1