nameof在C#中包含运算符的情绪很多.作为此运算符如何工作的示例,nameof(Customer.Name)将返回字符串"Name".
我有一个域对象.我必须绑定它.然后我需要属性的名称作为字符串.我希望它们是类型安全的.
我记得在.NET 3.5中遇到过一种解决方法,它提供了nameoflambda表达式的功能和涉及的lambda表达式.但是,我无法找到此解决方法.任何人都可以为我提供这种解决方法吗?
我也对nameof如果可能的话在.NET 2.0中实现功能的方法感兴趣.
简而言之:如何成功编辑数据库条目而无需在编辑视图中包含模型的每个字段?
更新
所以我在DB(文章)中有一个项目.我想编辑一篇文章.我编辑的文章有很多属性(Id,CreatedBy,DateCreated,Title,Body).其中一些属性永远不需要更改(如Id,CreatedBy,DateCreated).因此,在我的编辑视图中,我只想要可以更改的字段的输入字段(如标题,正文).当我像这样实现编辑视图时,模型绑定失败.我没有提供输入的任何字段都设置为某个"默认"值(如DateCreated设置为01/01/0001 12:00:00 am).如果我确实为每个字段提供输入,一切正常,文章按预期编辑.我不知道是否正确地说"模型绑定失败"是必要的,如果"如果在编辑视图中没有为它们提供输入字段,则系统会填充包含不正确数据的字段".
如何以这样的方式创建编辑视图:我只需要为可以/需要编辑的字段提供输入字段,以便在调用Controller中的Edit方法时,正确填充DateCreated等字段,而不设置某些默认值,不正确的值?这是我目前的编辑方法:
[HttpPost]
public ActionResult Edit(Article article)
{
// Get a list of categories for dropdownlist
ViewBag.Categories = GetDropDownList();
if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
{
if (ModelState.IsValid)
{
article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
article.LastUpdated = DateTime.Now;
article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);
_db.Entry(article).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(article);
}
// User not allowed to edit
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
编辑视图是否有帮助:
. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
<p>
<input type="submit" value="Save" …Run Code Online (Sandbox Code Playgroud) 在我的ASP.net mvc应用程序中,我使用服务层和存储库来保持我的控制器很薄.典型的详细信息只读视图如下所示:
public ActionResult Details(int id)
{
var project = _projectService.GetById(id);
return View(Mapper.Map<Project, ProjectDetails>(project));
}
Run Code Online (Sandbox Code Playgroud)
服务层:
public class ProjectService : IProjectService
{
public Project GetById(int id)
{
var project = _projectRepository.GetProject(id);
// do some stuff
return project;
}
}
public class ProjectRepository : IProjectRepository
{
public Project GetProject(int id)
{
return context.Projects.Find(id);
}
}
Run Code Online (Sandbox Code Playgroud)
从服务层移动到视图模型非常容易,因为自动化器可以很容易地平整事物.从视图模型直接移动另一个传递到我的服务层是我努力想出一个好的解决方案的地方.
在像Create一样的情况下,有什么好办法呢?
[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
if(!ModelState.IsValid)
{
return View(model);
}
// TODO
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
我很确定服务层不应该对视图模型有任何了解,但我也不认为AutoMapper在这种情况下运行良好,因为它不擅长采用扁平模型并将其变成复杂对象.
我的控制器应该如何与服务层通信?我想尽可能保持控制器中的代码.
假设我有两个我想要映射的对象:
// Domain objects
public class MyDomainObject
{
public string SimpleText { get; set; }
public int SimpleNumber { get; set; }
public MySubObject ComplexValue { get; set; }
}
public class MySubObject
{
public int Id { get; set; }
public string Name { get; set; }
}
// DTOs
public class MyDto
{
public string SimpleText { get; set; }
public int SimpleNumber { get; set; }
public int ComplexValueId { get; set; }
public string ComplexValueName { …Run Code Online (Sandbox Code Playgroud) c# ×3
.net ×2
asp.net-mvc ×2
.net-2.0 ×1
.net-3.5 ×1
automapper ×1
data-binding ×1
mapping ×1
viewmodel ×1