gpt4 book ai didi

asp.net - ASP.NET MVC 中用于读取、创建和更新操作的单独 ViewModel

转载 作者:行者123 更新时间:2023-12-02 04:06:39 25 4
gpt4 key购买 nike

我在 ASP.NET MVC 项目中使用相同的 ViewModel,但对于一千条记录,似乎最好不要从数据库检索未使用的记录。例如,假设 UserViewModel 用于读取创建更新情况,如下所示:

public class UserViewModel
{
public int Id { get; set; }

public string Email { get; set; }

public string Password { get; set; }

public string ConfirmPassword { get; set; }

public bool EmailConfirmed { get; set; }

public virtual int AccessFailedCount { get; set; }

public virtual bool LockoutEnabled { get; set; }

public virtual DateTime? LockoutEndDateUtc { get; set; }

public virtual string PasswordHash { get; set; }

public virtual string PhoneNumber { get; set; }

public virtual bool PhoneNumberConfirmed { get; set; }

public virtual string SecurityStamp { get; set; }

public virtual bool TwoFactorEnabled { get; set; }
}

阅读:当显示记录的详细信息时,我需要检索除密码之外的所有属性(我知道我也可以在没有 的情况下检索数据) ViewModel,但有时我需要在一个ViewModel中组合多个 View ,这也是类似的情况)。

创建:创建新记录时,我不需要使用 Id、EmailConfirmedAccessFailedCount等专栏。

更新:更新记录时,我也不需要使用某些属性。

在这种情况下,使用ViewModel的最佳方法是什么?创建单独的 ViewModel,即 ReadUserViewModelCreateUserViewModelUpdateUserViewModel 或使用相同的 ViewModel 为同一组数据?任何帮助,将不胜感激。

最佳答案

我的回答已经很晚了,但我希望它仍然可以帮助那里的人。

我同意 Yvette Colomb 指出的内容,但我确实认为在某些情况下最好只有 1 个 View 和 ViewModel 用于创建和更新操作。事实上,我什至写了一篇关于它的博客文章,如果你感兴趣的话可以在这里找到它:https://blog.sandervanlooveren.be/posts/mvc-best-practices-for-create-update/ .

基本上,您所做的就是创建一个 baseViewModel,它知道您是在创建还是更新并在 View 中使用它。大多数情况下,用户可以编辑的属性与他在创建时可以填写的属性相同。

你的baseViewModel可能看起来像这样(我让它尽可能可重用):

public abstract class BaseFormViewModel<T>
{
public bool IsUpdate => !GetId().Equals(default(T));

protected abstract T GetId();

/// <summary>
/// Gets the action name based on the lambda supplied
/// </summary>
/// <typeparam name="TController"></typeparam>
/// <param name="action"></param>
/// <returns></returns>
protected string GetActionName<TController>(Expression<Func<TController, ActionResult>> action) where TController : Controller
{
return ((MethodCallExpression)action.Body).Method.Name;
}
}

在你看来,你可以有这样的东西:

@using (Html.BeginForm(Model.ActionName, "Person", FormMethod.Post, new  { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
if (Model.IsUpdate)
{
@Html.HiddenFor(m => m.Person.Id)
}
<div class="form-group">
@Html.LabelFor(m => m.Person.Firstname, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Person.Firstname, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Person.Firstname)
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Person.Lastname, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Person.Lastname, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Person.Lastname)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Save" />
</div>
</div>
}

请参阅我的博文,了解有关如何充分利用此 ViewModel 潜力的更多信息。

关于asp.net - ASP.NET MVC 中用于读取、创建和更新操作的单独 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39178616/

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