所以,标题应该说明一切.
要在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件更好的东西:
它们在呈现HTML帮助程序时尊重模型层次结构(例如,如果在"Foo"模型上有"Bar"对象,则"Bar"的HTML元素将使用"Foo.Bar.ElementName"呈现,而部分将具有"的ElementName").
更强大,例如,如果你List<T>在ViewModel中有一些东西,你可以使用@Html.DisplayFor(model => model.CollectionOfFoo),而MVC足够聪明,可以看到它是一个集合,并为每个项目渲染单个显示(而不是Partial,这需要一个明确的环).
我也听说DisplayFor呈现了一个"只读"模板,但我不明白 - 我不能在那里扔一个表格吗?
有人能告诉我一些其他原因吗?是否有一个列表/文章比较这三个?
asp.net-mvc asp.net-mvc-partialview editortemplates razor asp.net-mvc-3
我最近一直在使用Entity Framework 4,并且稍微混淆了何时使用ObjectSet.Attach和ObjectSet.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",为什么还需要额外的查询才能获得他的第一个?我能做到这一点: …
如果它们存在于编程中),
如果我有一个包含以下输入的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选择器来做到这一点.
当然不是很重要,但我只是一只好奇的猫.
有任何想法吗?
我有以下两种操作方法(简化问题):
[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
我有一张在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)
有任何想法吗?
这是我用户定义的表格类型......
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
如果我有这样的控制器:
[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) 尝试使用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.
显然我错过了什么 - 但是什么?
如果我有以下实体:
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表...
我怎么能自动:
当我自动说,我的意思是我希望能够做到这一点:
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
我正在进行一些单元测试,并使用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) asp.net-mvc ×5
c# ×5
.net ×2
razor ×2
unit-testing ×2
actionlink ×1
ajax ×1
controller ×1
crud ×1
css ×1
gdi ×1
html ×1
jpeg ×1
json ×1
jsonresult ×1
metadata ×1
modelstate ×1
moq ×1
sql-server ×1
t-sql ×1