gpt4 book ai didi

asp.net - 没有默认构造函数的 ActionResult 参数

转载 作者:行者123 更新时间:2023-12-01 11:00:12 24 4
gpt4 key购买 nike

显然有很多方法可以做到这一点,但我想我会征求一些关于这些方法的优缺点的反馈。

首先,NerdDinner 教程的 Edit Action 的形式为(比如 Form A):

[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {

在我看来,如果你很好地塑造你的 ViewModels 以匹配你的观点,那么方法 Form B:

[HttpPost]
public ActionResult Edit(MyViewModel mvm) {

似乎是一种更好、更简洁的方法。然后我将 VM 属性映射到模型属性并保存。但是,如果此 ViewModel 中嵌入了其他通过构造函数初始化的实体(例如在 nerddinner 教程中),那么如果没有默认构造函数并且您必须使用第一种方法,则此编辑操作将失败。

那么,第一个问题是您是否同意一般情况下 B 型通常更好?有缺点吗?

其次,如果使用 Form B,装饰器类型验证似乎需要在 ViewModel 中进行。在 ViewModel 中嵌入实体并仅在实体级别进行验证是否有优势?

最佳答案

这是一个非常笼统的 SO 问题。

the first question is do you agree that generally Form B is usually better?

我唯一不使用 Form B 的时候是上传文件的时候。否则,我认为任何人都不需要使用 Form A。我认为人们使用 Form A 的原因是缺乏对 ASP.Net 版本 MVC 功能的理解。

Secondly, it seems then if Form B is used, the decorator type validation would need to be in the ViewModel.

有点/这取决于。我给你举个例子:

public IValidateUserName
{
[Required]
string UserName { get; set; }
}

public UserModel
{
string UserName { get; set; }
}

[MetadataType(typeof(IValidateUserName))]
public UserValiationModel : UserModel
{
}

验证装饰器在一个接口(interface)中。我在派生类上使用 MetadataType 来验证派生类型。我个人喜欢这种做法,因为它允许可重复使用的验证,并且 MetadataType/Validation 不是 ASP.NET 核心功能的一部分,因此它可以在 ASP.Net (MVC) 应用程序之外使用。

Are there advantages of embedding entities in ViewModels ..

是的,我尽最大努力从不将基本模型传递给 View 。这是我不做的事的一个例子:

public class person { public Color FavoriteColor { get; set; } }

ActionResult Details()
{
Person model = new Person();
return this.View(model);
}

当您想将更多数据传递给 View 时会发生什么(对于局部数据或布局数据)?大多数时候该信息与 Person 无关,因此将其添加到 Person 模型没有任何意义。相反,我的模型通常看起来像:

public class DetailsPersonViewModel()
{
public Person Person { get; set; }
}

public ActionResult Details()
{
DetailsPersonViewModel model = new DetailsPersonViewModel();
model.Person = new Person();
return this.View(model);
}

现在我可以向 DetailsPersonViewModel 添加所需的数据,该 View 需要超出 Person 所知的范围。例如,假设这将显示一个包含所有颜色的 for,供 Person 选择最喜欢的颜色。所有可能的颜色都不是人的一部分,也不应该是人模型的一部分,所以我将它们添加到 DetailPersonViewModel。

public class DetailsPersonViewModel()
{
public Person Person { get; set; }
public IEnumerable<Color> Colors { get; set; }
}

.. and keeping the validation at the entity level only?

System.ComponentModel.DataAnnotations 不是为了验证属性的特性而设计的,所以做类似的事情:

public class DetailsPersonViewModel()
{
[Required(property="FavoriteColor")]
public Person Person { get; set; }
}

不存在也没有意义。为什么 ViewModel 不应包含对需要验证的实体的验证。

this edit action fails if there is no default constructor and you'd have to use the first approach.

正确,但为什么 ViewModel 或 ViewModel 中的实体没有无参数构造函数?听起来像是一个糟糕的设计,即使对此有一些要求,也可以通过 ModelBinding 轻松解决。这是一个例子:

// Lets say that this person class requires 
// a Guid for a constructor for some reason
public class Person
{
public Person(Guid id){ }
public FirstName { get; set; }
}

public class PersonEditViewModel
{
public Person Person { get; set; }
}

public ActionResult Edit()
{
PersonEditViewModel model = new PersonEditViewModel();
model.Person = new Person(guidFromSomeWhere);

return this.View(PersonEditViewModel);
}

//View
@Html.EditFor(m => m.Person.FirstName)

//Generated Html
<input type="Text" name="Person.FirstName" />

现在我们有一个表单,用户可以输入新的名字。我们如何取回此构造函数中的值?很简单,ModelBinder 并不关心它绑定(bind)到什么模型,它只是将 HTTP 值绑定(bind)到匹配的类属性。

[MetadataType(typeof(IPersonValidation))]
public class UpdatePerson
{
public FirstName { get; set; }
}

public class PersonUpdateViewModel
{
public UpdatePerson Person { get; set; }
}

[HttpPost]
public ActionResult Edit(PersonUpdateViewModel model)
{
// the model contains a .Person with a .FirstName of the input Text box
// the ModelBinder is simply populating the parameter with the values
// pass via Query, Forms, etc

// Validate Model

// AutoMap it or or whatever

// return a view
}

关于asp.net - 没有默认构造函数的 ActionResult 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com