小编RPM*_*984的帖子

ASP.NET MVC 3 - 部分vs显示模板与编辑器模板

所以,标题应该说明一切.

要在ASP.NET MVC中创建可重用的组件,我们有3个选项(可能是其他我没有提到的):

局部视图:

@Html.Partial(Model.Foo, "SomePartial")
Run Code Online (Sandbox Code Playgroud)

自定义编辑模板:

@Html.EditorFor(model => model.Foo)
Run Code Online (Sandbox Code Playgroud)

自定义显示模板:

@Html.DisplayFor(model => model.Foo)
Run Code Online (Sandbox Code Playgroud)

就实际的View/HTML而言,所有三种实现都是相同的:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是 - 你何时/如何决定使用三者中的哪一个?

我真正想要的是在创建问题之前要问自己的问题列表,其答案可用于决定使用哪个模板.

以下是我使用EditorFor/DisplayFor找到的2件更好的东西:

  1. 它们在呈现HTML帮助程序时尊重模型层次结构(例如,如果在"Foo"模型上有"Bar"对象,则"Bar"的HTML元素将使用"Foo.Bar.ElementName"呈现,而部分将具有"的ElementName").

  2. 更强大,例如,如果你List<T>在ViewModel中有一些东西,你可以使用@Html.DisplayFor(model => model.CollectionOfFoo),而MVC足够聪明,可以看到它是一个集合,并为每个项目渲染单个显示(而不是Partial,这需要一个明确的环).

我也听说DisplayFor呈现了一个"只读"模板,但我不明白 - 我不能在那里扔一个表格吗?

有人能告诉我一些其他原因吗?是否有一个列表/文章比较这三个?

asp.net-mvc asp.net-mvc-partialview editortemplates razor asp.net-mvc-3

302
推荐指数
3
解决办法
7万
查看次数

实体框架4 - AddObject与Attach

我最近一直在使用Entity Framework 4,并且稍微混淆了何时使用ObjectSet.AttachObjectSet.AddObject.

根据我的理解:

  • 当实体已存在于系统中时使用"附加"
  • 创建全新实体时使用"AddObject"

所以,如果我正在创建一个新人,我会这样做.

var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

如果我正在修改现有的人,我这样做:

var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

请记住,这是一个非常简单的例子.实际上我使用的是Pure POCO(无代码生成),Repository模式(不处理ctx.Persons)和Unit of Work(不处理ctx.SaveChanges).但是"在幕后",以上是我的实施中发生的事情.

现在,我的问题 - 我还没有找到一个我不得不使用Attach的场景.

我在这里失踪了什么?我们什么时候需要使用Attach?

编辑

只是为了澄清,我正在寻找何时使用Attach over AddObject(或反之亦然)的示例.

编辑2

下面的答案是正确的(我接受了),但我认为我会添加另一个例子,其中Attach将是有用的.

在我上面修改现有Person的示例中,实际上正在执行两个查询.

一个用于检索Person(.SingleOrDefault),另一个用于执行UPDATE(.SaveChanges).

如果(出于某种原因),我已经知道系统中存在"Joe Bloggs",为什么还需要额外的查询才能获得他的第一个?我能做到这一点: …

.net c# crud entity-framework-4

128
推荐指数
3
解决办法
9万
查看次数

CSS输入类型选择器 - 可能具有"或"或"非"语法?

如果它们存在于编程中),

如果我有一个包含以下输入的HTML表单:

<input type="text" />
<input type="password" />
<input type="checkbox" />
Run Code Online (Sandbox Code Playgroud)

我想将样式应用于所有type="text"或其中的输入type="password".

或者,我会满足所有输入的位置type != "checkbox".

看起来我必须这样做:

input[type='text'], input[type='password']
{
   // my css
}
Run Code Online (Sandbox Code Playgroud)

有没有办法:

input[type='text',type='password']
{
   // my css
}
Run Code Online (Sandbox Code Playgroud)

要么

input[type!='checkbox']
{
   // my css
}
Run Code Online (Sandbox Code Playgroud)

我环顾四周,似乎没有办法用一个CSS选择器来做到这一点.

当然不是很重要,但我只是一只好奇的猫.

有任何想法吗?

html css css-selectors

93
推荐指数
2
解决办法
12万
查看次数

ASP.NET MVC - 如何在RedirectToAction中保留ModelState错误?

我有以下两种操作方法(简化问题):

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   // get some stuff based on uniqueuri, set in ViewData.  
   return View();
}

[HttpPost]
public ActionResult Create(Review review)
{
   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}
Run Code Online (Sandbox Code Playgroud)

因此,如果验证通过,我将重定向到另一页(确认).

如果发生错误,我需要显示包含错误的同一页面.

如果我这样做return View(),则会显示错误,但如果我这样做return RedirectToAction(如上所述),则会丢失模型错误.

我对这个问题并不感到惊讶,只是想知道你们是怎么处理这个问题的?

我当然可以返回相同的View而不是重定向,但我在"Create"方法中有逻辑,它填充了视图数据,我必须复制它.

有什么建议?

error-handling asp.net-mvc redirecttoaction modelstate http-redirect

85
推荐指数
5
解决办法
5万
查看次数

阅读JPEG元数据的问题(方向)

我有一张在iphone上拍摄的JPEG图像.在我的台式PC(Windows照片查看器,谷歌浏览器等)上,方向不正确.

我正在开发一个ASP.NET MVC 3 Web应用程序,我需要上传照片(目前正在使用plupload).

我有一些服务器端代码来处理图像,包括读取EXIF数据.

我已经尝试PropertyTagOrientation在EXIF元数据中读取字段(使用GDI - Image.PropertyItems),但该字段不存在.

所以它是一些特定的iphone元数据,或者其他一些元数据.

我使用了另一种工具,如Aurigma Photo Uploader,它正确读取元数据并旋转图像.它是如何做到的?

有没有人知道其他JPEG元数据可以包含所需的信息,以便知道它需要旋转,Aurigma使用的是什么?

这是我用来读取EXIF数据的代码:

var image = Image.FromStream(fileStream);

foreach (var prop in image.PropertyItems)
{
   if (prop.Id == 112 || prop.Id == 5029)
   {
      // do my rotate code - e.g "RotateFlip"
      // Never get's in here - can't find these properties.
   }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# jpeg metadata gdi image-processing

51
推荐指数
4
解决办法
3万
查看次数

SQL Server 2008 - 如何从表值函数返回用户定义的表类型?

这是我用户定义的表格类型......

CREATE TYPE [dbo].[FooType] AS TABLE(
 [Bar] [INT],
)
Run Code Online (Sandbox Code Playgroud)

这是我在表值函数中必须要做的事情,以返回类型:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes TABLE ([Bar] [INT])
INSERT INTO @FooTypes (1)
RETURN
Run Code Online (Sandbox Code Playgroud)

基本上,我必须在函数的RETURN语句中重新声明我的类型定义.有没有办法我可以简单地在RETURN语句中声明类型?

我原以为这会起作用:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes [FooType]
INSERT INTO @FooTypes (1)
RETURN
Run Code Online (Sandbox Code Playgroud)

在MSDN/Google上找不到关于此的任何帮助....任何人?

编辑

我没有标记我的答案,并提出了这个问题 - 因为我在6个月后遇到了同样的情况.

有没有人知道是否可以从表值函数返回用户定义的表类型?如果没有,除了我所做的以外,还有更好的解决方法吗?(再次重新声明类型).

t-sql sql-server user-defined-functions user-defined-types sql-server-2008

42
推荐指数
2
解决办法
3万
查看次数

如何对返回JsonResult的Action方法进行单元测试?

如果我有这样的控制器:

[HttpPost]
public JsonResult FindStuff(string query) 
{
   var results = _repo.GetStuff(query);
   var jsonResult = results.Select(x => new
   {
      id = x.Id,
      name = x.Foo,
      type = x.Bar
   }).ToList();

   return Json(jsonResult);
}
Run Code Online (Sandbox Code Playgroud)

基本上,我从我的存储库中获取东西,然后将其投影到一个List<T>匿名类型中.

我该如何对其进行单元测试?

System.Web.Mvc.JsonResult有一个叫做的属性Data,但它的类型object,正如我们所期望的那样.

那么这是否意味着如果我想测试JSON对象具有我期望的属性("id","name","type"),我必须使用反射?

编辑:

这是我的测试:

// Arrange.
const string autoCompleteQuery = "soho";

// Act.
var actionResult = _controller.FindLocations(autoCompleteQuery);

// Assert.
Assert.IsNotNull(actionResult, "No ActionResult returned from action method.");
dynamic jsonCollection = actionResult.Data;
foreach (dynamic json in jsonCollection)
{
   Assert.IsNotNull(json.id, 
       "JSON record does …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc json unit-testing jsonresult

42
推荐指数
3
解决办法
3万
查看次数

ASP.NET MVC 3(Razor)Ajax.ActionLink - 我做错了什么?

尝试使用AJAX操作链接,在单击时,应该执行一个HttpGet操作方法,该方法返回PartialViewResult并将HTML推送到div中.

这是我的观点:

<div id="admin-options" class="admin"></div>
@Ajax.ActionLink("Show Admin Options", "ShowOptions", "Post", new { area = "Admin" }, new AjaxOptions { UpdateTargetId = "admin-options", HttpMethod = "GET" })
Run Code Online (Sandbox Code Playgroud)

这是动作方法:

public class PostController : Controller
{
   [HttpGet]
   [Authorize(Roles="Admin")]
   public PartialViewResult ShowOptions()
   {
      return PartialView();
   }
}
Run Code Online (Sandbox Code Playgroud)

这是它生成的HTML:

<a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#admin-options" href="/Admin/Post/ShowOptions">Show Admin Options</a>
Run Code Online (Sandbox Code Playgroud)

看起来很好.

但它不是进行AJAX调用,而是通过浏览器URL进行常规HTTP GET,并重定向到/ Admin/Post/ShowOptions.

显然我错过了什么 - 但是什么?

ajax asp.net-mvc actionlink razor asp.net-mvc-3

42
推荐指数
2
解决办法
3万
查看次数

实体框架/ SQL2008 - 如何自动更新实体的LastModified字段?

如果我有以下实体:

public class PocoWithDates
{
   public string PocoName { get; set; }
   public DateTime CreatedOn { get; set; }
   public DateTime LastModified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这对应于具有相同名称/属性的SQL Server 2008表...

我怎么能自动:

  1. 将记录的CreatedOn/LastModified字段设置为现在(执行INSERT时)
  2. 将记录的LastModified字段设置为现在(执行UPDATE时)

当我自动说,我的意思是我希望能够做到这一点:

poco.Name = "Changing the name";
repository.Save(); 
Run Code Online (Sandbox Code Playgroud)

不是这个:

poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();
Run Code Online (Sandbox Code Playgroud)

在幕后,"某事"应该自动更新日期时间字段.什么是"东西"?

我正在使用Entity Framework 4.0 - 有没有一种方法可以让EF为我自动执行此操作?(EDMX中的特殊设置可能?)

从SQL Server端,我可以使用DefaultValue,但这只适用于INSERT(不是UPDATE).

类似地,我可以使用POCO上的构造函数设置默认值,但这只会在实例化对象时起作用.

当然我可以使用触发器,但它并不理想.

因为我正在使用Entity Framework,我可以挂钩到SavingChanges事件并在这里​​更新日期字段,但问题是我需要"了解"POCO(目前,我的存储库是用泛型实现的).我需要做一些OO技巧(比如让我的POCO实现一个接口,然后调用一个方法).我并不反对,但如果我必须这样做,我宁愿手动设置字段.

我基本上在寻找SQL Server …

.net c# sql-server-2008 entity-framework-4 datetime-generation

41
推荐指数
4
解决办法
2万
查看次数

为什么我想要模拟的属性需要是虚拟的?

我正在进行一些单元测试,并使用Moq模拟一些属性.

现在,这是一个Controller测试(ASP.NET MVC 3).我的控制器派生自一个名为AbstractController抽象控制器.

该控制器依赖于Http Context(为了做主题,基于HTTP HOST头的特定于域的逻辑等).

这是通过名为WebSiteSettings的属性完成的:

public abstract class AbstractController : Controller
{
   public WebSiteSettings WebSiteSettings { get; private set; }

   // other code
}
Run Code Online (Sandbox Code Playgroud)

注意私人集 - ctor设置它.所以,我把它改成使用了一个界面,这就是我所嘲笑的:

public IWebSiteSettings WebSiteSettings { get; private set; }
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个"FakeWebSiteSettings",它嘲笑Http Context以便它读取HTTP头.

问题是,当我运行测试时,我得到一个NotSupportedException:

非虚拟(在VB中可覆盖)成员的设置无效:x => x.WebSiteSettings

这是相关的模拟代码:

var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);

_controller = mockController.Object;

var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unit-testing controller moq

39
推荐指数
1
解决办法
7万
查看次数